第五章 LIUNX系统调用.pdf

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 LIUNX系统调用

第5 章 系统调用 第5 章 系统调用 大部分介绍Unix 内核的书籍都没有仔细说明系统调用,我认为这是一个失误。实际上, 我们实际需要的系统调用现在已经十分完美。因此,从某种意义上来说,研究系统调用的实 现是无意义的——如果你想为Linux 内核的改进贡献自己的力量,还有其它许多方面更值得 投入精力。 然而,对于我们来说,仔细研究少量系统调用是十分值得的。这样就有机会初步了解一 些概念,这些概念将随本书发展而进行详细介绍,例如进程处理和内存。这使得你可以趁机 详细了解一下Linux 内核编程的特点。这包括一些和你过去在学校里 (或工作中)所学的内 容不同的方法。和其它编程任务相比,Linux 内核编程的一个显著特点是它不断同三个成见 进行斗争——这三个成见就是速度、正确和清晰——我们不可能同时获取这三个方面…至少 并不总是能够。 什么是系统调用 系统调用发生在用户进程 (比如 emacs )通过调用特殊函数(例如 open )以请求内核 提供服务的时候。在这里,用户进程被暂时挂起。内核检验用户请求,尝试执行,并把结果 反馈给用户进程,接着用户进程重新启动,随后我们就将详细讨论这种机制。 系统调用负责保护对内核所管理的资源的访问,系统调用中的几个大类主要有:处理 I/O 请求 (open,close,read,write,poll 等等),进程(fork,execve,kill ,等等),时间 (time,settimeofday 等等)以及内存 (mmap ,brk ,等等)的系统调用。几乎所有的系统 调用都可以归入这几类中。 然而,从根本上来说,系统调用可能和它表面上有所不同。首先,在Linux 中,C 库中 对于一些系统调用的实现是建立在其它系统调用的基础之上的。例如,waitpid 是通过简单 调用wait4 实现的,但是它们两个都是作为独立的系统调用说明的。其它的传统系统调用, 如sigmask 和ftime 是由C 库而不是由Linux 内核本身实现的;即使不是全部,至少大部分 是如此。 当然,从技巧的一面来看这是无害的——从应用程序的观点来看,系统调用就和其它的 函数调用一样。只要结果符合预计的情况,应用程序就不能确定是否真正使用到了内核。(这 种处理方式还有一个潜在的优点:用户可以直接触发的内核代码越少,出现安全漏洞的机会 也就越少。)但是,由于使用这种技巧所引起的困扰将会使我们的讨论更为困难。实际上, 系统调用这一术语通常被演讲者用来说明在第一个Unix 版本中的任何对系统的调用。但是 在本章中我们只对“真正”的系统调用感兴趣——真正的系统调用至少包括用户进程对部分 内核代码的调用。 系统调用必须返回int 的值,并且也只能返回int 的值。为了方便起见,返回值如果为 零或者为正,就说明调用成功;为负则说明发生了错误。就像老练的 C 程序员所知道的一 样,当标准C 库中的函数发生错误时会通过设置全局整型变量errno 指明发生错误的属性, 系统调用的原理和它相同。然而,仅仅研究内核源程序代码并不能够获得这种系统调用方式 的全部意义。如果发生了错误,系统调用简单返回自己所期望的负数错误号,其余部分则由 标准C 库实现。(正常情况下,用户代码并不直接调用内核系统函数,而是要通过标准C 库 中专门负责翻译的一个小层次(thin layer )实现。)我们随便举一个例子,27825 行 (sys_nanosleep 的一部分)返回-EINVAL 指明所提供的值越界了。标准 C 库中实际处理 - 41 - 第5 章 系统调用 sys_nanosleep 的代码会注意到返回的负值,从而设置 errno 和 EINVAL ,并且自己返回-1 给原始的调用者。 在最近的内核版本中,系统调用返回负值偶尔也不一定表示错误了。在目前的几个系统 调用中(例如 lseek ),即使结果正确也会返回一个很大的负值。最近,错误返回值是在-1 到-4095 范围之内。现在,标准C 库实现能够以更加成熟和高级的方式解释系统调用的返回 值;当返回值为负时,内核本身就不用再做任何特殊的处理了。 中断、内核空间和用户空间 我们将在第6 章中介绍中断和

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档