第5章系统调用..docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第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库中实际处理sys_nanosleep的代码会注意到返回的负值,从而设置errno和EINVAL,并且自己返回-1给原始的调用者。 在最近的内核版本中,系统调用返回负值偶尔也不一定表示错误了。在目前的几个系统调用中(例如lseek),即使结果正确也会返回一个很大的负值。最近,错误返回值是在-1到-4095范围之内。现在,标准C库实现能够以更加成熟和高级的方式解释系统调用的返回值;当返回值为负时,内核本身就不用再做任何特殊的处理了。 中断、内核空间和用户空间 我们将在第6章中介绍中断和在第8章中介绍内存时再次明确这些概念。但是在本章中,我们只需要粗略地了解一些术语。 第一个术语是中断(interrupt),它来源于两个方面:硬件中断,例如磁盘指明其中存放一些数据(这与本章无关);和软件中断,一种等价的软件机制。在x86系列CPU中,软件中断是用户进程通知内核需要触发系统调用的基本方法(出于这种目的使用的中断号是0x80,对于Intel芯片的研究者来说更为熟悉的是INT 80)。内核通过system_call(171行)函数响应中断,这一点我们马上就会介绍。 另外两个术语是内核空间(kernel space)和用户空间(user space),它们分别对应内核保留的内存和用户进程保留的内存。当然,多用户进程也经常同时运行,而且各个进程之间通常不会共享它们的内存,但是,任何一个用户进程使用的内存都称为用户空间。

文档评论(0)

s4c2bg5I + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档