如何进入系统调用

要想进入系统调用,一般通过c库函数。函数通过软中断号0x80从用户态进入内核态,调用相应的中断处理程序,通过传递的参数在内核态运行中断代码。

通常系统调用靠c库支持。用户程序通过包含标准头文件并和c库链接,就可以使用系统调用。但是如果是自己在底层实现的系统调用,可能c库并不支持,很庆幸,linux本身提供了一组宏,用于直接对系统调用进行访问。它会设置好寄存器并调用陷入命令。这些宏就是_syscalln(),其中n的范围从0到6,代表需要传递给系统调用的参数个数,这事因为该宏必须了解有多少参数按照什么次序压入寄存器。举个open系统调用的例子,c库已经实现了open函数,我们这里自己实现open系统调用函数。

open函数的系统调用定义是: long open(const char* filename, int flags, int mode);

我们自己用_syscalln()实现为:
#define NR_open 5
_syscall3(long, open, const char*, filename, int, flags, int, mode)

int main(){
int fd = open("filename", flags, mode);
close(fd);
return 0;
}

这里我们没有实现close,所以调用了c库的,但是调用了自己实现的open函数。


你可能感兴趣的:(编程,linux,内核)