Skip to main content

07 系统调用

glibc 对系统调用的封装

int open(const char *pathname, int flags, mode_t mode)

调用系统调用是使用 DO_CALL这个宏

32 位系统调用过程

  • 用户态
  • 将请求参数保存到寄存器
  • 将系统调用名称转为系统调用号保存到寄存器 eax 中
  • 通过软中断 ENTER_KERNEL 进入内核态
  • 内核态
  • 将用户态的寄存器保存到 pt_regs 中
  • 在系统调用函数表 sys_call_table 中根据调用号找到对应的函数
  • 执行函数实现, 将返回值写入 pt_regs 的 ax 位置
  • 通过 INTERRUPT_RETURN 根据 pt_regs 恢复用户态进程

64 位系统调用过程

  • 用户态
  • 将请求参数保存到寄存器
  • 将系统调用名称转为系统调用号保存到寄存器 rax 中
  • 通过 syscall 进入内核态
  • 内核态
  • 将用户态的寄存器保存到 pt_regs 中
  • 在系统调用函数表 sys_call_table 中根据调用号找到对应的函数
  • 执行函数实现, 将返回值写入 pt_regs 的 ax 位置
  • 通过 sysretq 返回用户态

系统调用表

sys_call_table:arch/x86/entry/syscall_64.c


2 common open sys_open

第一列是系统调用号,第三列是系统调用的名字,第四列是系统调用在内核的实现函数。