系统调用
系统调用是操作系统提供给用户程序调用系统服务的一组“特殊”接口。
前言
系统调用
系统调用可被看成是一个内核与用户空间程序交互的接口,它把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。
系统调用的作用
与具体的硬件完全隔离,用户不需要面向具体的硬件编码,降低了开发的复杂性和难度。极大的提高了系统的安全性
用户进程不允许访问内核数据,也无法使用内核函数。用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。
中断实现系统调用
软件中断
它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。
系统调用控制程序执行软件中断的过程如下:
1.在进程的内核态堆栈中保存大多数寄存器的内容(即保存恢复进程到用户态执行所需要的上下文)
2.根据用户态传递的系统调用号,确定系统调用的执行程序
3.调用相应的执行程序来处理系统调用
4.从系统调用返回
系统调用号和系统调用表
系统调用号:
每个系统调用被赋予一个系统调用号,与具体的系统调用相关联。
系统调用表:
内核维护系统调用表,保存系统调用函数的起始地址,系统调用号对应系统调用在调用表中的偏移量。
执行系统调用
glibc库
glibc是Linux下使用的开源的标准C库,它是GNU发布的libc库,即运行时库。
syscall 调用
glibc提供的syscall函数,直接调用。
glibc库
- 每个特定的系统调用对应了至少一个glibc封装的库函数
- 多个API也可能只对应同一个系统调用
- 返回值-1在多数情况下表示内核不能满足进程的请求
- Libc中定义的errno变量包含特定的错误码
glibc函数库对比Syscall调用
| 优势 | 劣势 |
---|
glibc函数库 | 只需了解glibc提供的API的原型,无须知道更多的细节,如系统调用号。其次,更好的移植性 | 没有封装某个内核提供的系统调用时无法使用 | syscall调用 | 可定制自己的系统调用 | 使用起来不方便 | | | |
|