Linux-系统调用

Linux-系统调用

  1. 什么是系统调用?
  2. 系统调用流程

什么是系统调用

系统调用是操作系统提供给程序开发人员使用系统服务接口

系统调用流程

Linux 提供了 glibc 库, 它封装了系统调用接口, 对上层更友好的提供服务, 系统调用最终都会通过 DO_CALL 发起, 这是一个宏定义, 其 32 位和 64 位的定义是不同的

32位系统调用
用户态

a. 将请求参数保存到寄存器
b. 将系统调用名称转换为调用号保存到eax中
c. 通过软中断ENTER_RETURN 进入内核态

内核态

a. 将用户态的寄存器保存到pt_regs中
b. 在系统调用表 sys_call_table中根据调用号找到响应函数
c. 执行函数,将返回值写入pt_regs中ax位置
d. 通过INTERRUPT_RETURN 根据pt_regs恢复用户态进程

64位系统调用
用户态

a. 将请求参数保存到寄存器
b. 将系统调用名称转换为系统调用号保存到寄存器rax中
c. 通过syscall进入内核态

内核态

a. 将用户态寄存器保存到pt_regs中
b. 在系统调用表sys_call_table 中根据调用号查找对于函数
c. 执行函数,将返回值写入pt_regs中的ax位置
d. 通过sysretq返回用户态