应用程序如何调用系统调用(哈工大OS实验三)
调用系统调用与调用普通自定义函数区别
通常情况下,调用系统调用和调用普通自定义函数在代码上并没有什么区别,但调用后发生的事情有很大不同。
调用自定义函数
调用自定义函数是通过call指令直接跳转到该函数的地址,继续运行。
调用系统调用
调用系统调用是调用系统库中为该系统调用编写的一个接口函数,即API。而API要做的就是去调用真正的系统调用,过程是:
- 把系统调用的编号存入EAX;
- 把函数参数存入其他通用寄存器;
- 触发0x80号中断(int 0x80)。
linux-0.11 中的close()API解析:
lib/close.c
其中_syscall1是一个宏,在include/unistd.h中定义
将_syscall1(int,close,int,fd)进行宏展开,可以得到:
int close(int fd)
{
long _res;
_asm_ volatile ("int $0x80"
: "=a" (_res)
: "=0" (_NR_close),"b" ((long)(fd)));
if(_res>=0)
return (int) _res;
errmo = -_res;
return -1;
}
这就是API的定义。它先将宏_NR_close存入EAX,将参数fd存入EBX,然后进行0x80中断调用。调用返回后。从EAX取出返回值,存入_res,再通过对_res的判断觉得传给API的调用者什么样的返回值。
其中_NR_close就是系统调用的编号,在include/unistd.h中定义: