1.系统调用
在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。 系统调用提供了用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。
Linux的系统调用通过int 80h实现,用系统调用号来区分入口函数。 操作系统实现系统调用的基本过程是:
应用程序调用库函数(API);
API将系统调用号存入EAX,然后通过中断调用使系统进入内核态;
内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
系统调用完成相应功能,将返回值存入EAX,返回到中断处理函数;
中断处理函数返回到API中;
API将EAX返回给应用程序。
寄存器eax存放调用号,剩下的几个寄存器存放参数。
以sys_write为例说明:
函数原型:
sys_write(unsigned int fd, const char * buf, size_t count)
[section .data]
strHello db “Hello, world!”,0Ah
STRLEN equ $ - strHello
[section .text]
global _start
_start:
mov edx,STRLEN;对应参数count
mov ecx,strHello;对应参数buf
mov ebx,1;对应参数fd,fd = 1,在linux中对应于stdout,指的是显示屏
mov eax,4;系统调用号为4,sys_write
int 0x80
mov ebx,0;参数为0,exit(0)
mov eax,1;系统调用号为1,sys_exit
int 0x80