系统调用的工作机制
系统调用
何为系统调用:
系统调用是操作系统为用户态进程与硬件设备进行交互提供的一组接口。
系统调用的意义:
- 把用户从底层的硬件编程中解放出来
- 极大地提高了系统的安全性
- 使用户程序具有可移植性
何为API:
应用编程接口(application program interface),和系统调用是不同的。
API与系统调用:
不是每个API都对应一个特定的系统调用。
- API可能直接提供用户态的服务,如,一些数学函数
- 一个单独的API可能调用了几个系统调用
- 不同的API可能调用了同一个系统调用
系统调用例程及服务例程:
当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。
传参:
系统调用号被用来指明需要的系统调用,使用eax寄存器。
系统调用也需要输入输出参数:
- 实际的值
- 用户态进程地址空间的变量的地址
- 甚至是包含指向用户态函数的指针的数据结构的地址
系统调用三层皮:
- API
- 中断向量
- 中断服务程序
-
当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。
-
Linux中是通过执行int $0x80来执行系统调用,这条汇编指令产生向量为128的编程异常 —— 即中断向量0x80与System_call绑定起来。
-
系统调用号将函数
xyz()
和中断服务程序sys_xyz
关联起来。
实验:
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
选取了20号系统调用getpid
使用man查看getpid的说明
c语言代码
运行结果
嵌入汇编代码
运行结果: