# linux 系统调用

# 系统调用是用于用户空间和内核空间之间接口的 API

# linux 中使用系统调用

可以在 linux 中使用系统调用,具体有一下步骤

  • 将系统调用号放在 EAX 寄存器中
  • 将参数存储在寄存器 EBX,ECX 等中的系统调用中
  • 调用相关的中断 (80h)
  • 结果通常在 EAX 寄存器中返回

由六个寄存器存储所使用的系统调用的参数

分别是 EBX,ECX,EDX,ESI,EDI EBP

这些寄存器采用连续参数,从 EBX 寄存器开始,如果有超过六个参数,则第一个参数的存储单元存储在 EBX 寄存器中

下面举出系统调用 sys_exit 以及 sys_write 的例子

mov eax,1   ;system call number (sys_exit)
int 0x80    ; call kernel
 mov eax,4       ; message length
 mov ecx,msg     ; message to write
 mov ebx,1       ; file descriptor (stdout)
 mov eax,4       ; system call number (sys_write)
 int 0x80        ; call kernel 

所有系统调用都列在 /user/include/asm/unistd.h 以及他们的编号(在调用 int 0x80 之前放入 eax 的值)

常用的系统调用以及编号如下

image-20220418225625486