参考书籍链接:微云链接
系统调用注意要点
- 系统调用会由用户态陷入到内核态,让内核去代替进行工作,以便访问受保护的资源
- 系统调用由软中断机制实现,也就是
0x80
中断 - 每个系统调用都是独一无二的,其由唯一的数字来标识
- 系统调用需要的参数又寄存器传入
系统调用的过程
-
通过外壳函数(库函数)来发起系统调用
-
参数通过堆栈传入外壳函数,外壳函数再将这些参数复制到寄存器中,总共有六个寄存器,这也就意味着参数最多有六个
-
外壳函数将对应的系统调用号写入eax寄存器
-
外壳函数执行一条中断指令
0x80
,引发处理器从用户态切换到内核态,并执行80中断所对应的代码 -
内核通过调用
system_call
例程去相应中断
相应过程如下:5.1 在内核中保存寄存器值
5.2 审核调用号是否有效
5.3 如果调用号有效,就去存放所有调用服务例程的列表中进行索引,发现并调用相应的系统调用服务例程
5.4 从内核栈中恢复各个寄存器的值,并将系统调用返回值置于栈中 -
如果系统调用发生错误,外壳函数就会设置全局变量errno
参考文献
[1] UNIX 系统编程手册(上) 第三章 系统编程概念