内核资料收集
Linux操作系统为用户在用户态的进程与硬件进程交互提供了一组接口.
在应用层和硬件之间设置一个额外层具有很多优点:
a. 这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来.
b. 极大提高系统安全性. 内核在试图满足请求前在接口级检查请求的正解性.
c. 这些接口使程序更有可移植性. 内核提供的接口相同,任一内核之上就可以正确地编译和执行程序.
unix系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口.
一. POSIX API 和系统调用
应用编程接口API与系统调用之不同:
a. 前者只是一个函数定义,说明了如何获得一个给定的服务;后者是通过软中断向内核发出一个明确的请求.
b. Unix系统给程序员提供了很多API的库函数. lib的标准C库所定义的一些API引用了封装例程(wrapper routine)(其唯一目的就是发布
系统调用).通常情况下,每个系统调用对应一个封装例程, 而封装例程定义了应用程序使用的API. 反之不然.
c. 一个API不必要对应在一个特定的系统调用. API可直接提供用户态的服务; 一个单独的API函数可能调用几个系统调用; 几个API函数
可能调用封装了不同功能的同一个系统调用.例libc库函数实现了malloc()/calloc()/free()等POSIX API, 这几个函数分配和释放所请求
的内存,并都利用brk()系统调用扩大或缩小进程的堆(heap).
d. POSIX标准针对API而不针对系统调用.判断一个系统调用是否与POSIX兼容要看它是否提供了一组合适的应用接口, 而不管对应的函数
是如何实现的. 事实上,一些非Unix系统被认为是与POSIX兼容的, 因为它们在用户态的库函数中提供了传统Unix能提供的所有服务.
e. 从编程者看, API和系统调用之间差别是没有关系的: 唯一相关的事情是函数名/函数类型及返回代码的含义. 然而, 从内核设计者的观
点看, 这种差别确实有关系, 因为系统调用属于内核, 而用户态的库函数不属于内核.
f. 大部分封装例程返回一个整数,其值的含义信赖于相应的系统调用.返回值-1通常表示内核不能满足进程的请求.系统调用处理程序的失败可
能是由无效参数引起的,也可能是因为缺乏可用资源,或硬件出了问题等等.在lic库中定义的error变量包含特定的出错码.
每个出错码都定义为一个常量宏(产生一个相应的正整数值). POSIX标准指定了很多出错码的宏名. 在/usr/include目录下的文件中定义了这些宏.
阅读(1267) | 评论(0) | 转发(0) |