linux内核注释-第5章系统调用
- 桑蚕
-
377 次阅读
-
118 次下载
- 共 11 页(0.13 M)
-
2022-05-02 22:37:51
点此付费下载 ¥ 2 知币
无需注册也可下载,点击付费按钮在弹框页面选择 "扫码直接下载”
在线预览效果若不佳,推荐下载后阅读 建议在PC浏览器扫码下载
文档简介(最多显示3000字):
第5章系统调用-41-第第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库中专门负责翻译的一个小层次(thinlayer)实现。)我们随便举一个例子,27825行(sys_nanosleep的一部分)返回-EINVAL指明所提供的值越界了。标准C库中实际处理
评论
发表评论