系统调用实现

时间:2012-10-08 06:26:20

标签: linux linux-kernel system-calls

如果用户应用程序进行系统调用,则会触发软件中断/异常。如何查看生成软件中断的源代码?

3 个答案:

答案 0 :(得分:8)

Linux Assembly Howto中对此进行了解释。你应该阅读维基百科syscall页面(以及约VDSO),以及intro(2)& syscalls(2)手册页。另请参阅this回答和this回复。另请参阅Gnu Libc& musl-libc源代码。还要学习使用strace来查找给定命令或进程发出的系统调用。

另请参阅与您的系统相关的calling conventions和应用程序二进制接口规范。对于x86-64,它是here

答案 1 :(得分:3)

很久很久以前,有一个int 0x80陷阱要进入内核,但现在sysenter是首选。

您可以通过转储vsyscall部分来获取代码,该部分由内核自动映射到每个进程。

$ cat /proc/self/maps 
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

了解更多信息,请查看this article

答案 2 :(得分:1)

可以使用Intel x86汇编指令int n触发软件中断,其中n是中断号。系统调用是软件中断的特例;在你可以通过

手动进行系统调用
mov eax, m
int 0x80

其中m应替换为中断号。以下是与32-bit syscall numbers64-bit syscall numbers相关联的列表,这些列表链接到每个功能的在线联机帮助页。您还需要通过其他寄存器(ebxecx等)将参数传递给系统调用,您可以阅读有关here的更多信息。

这是进行系统调用的最常用方法,因为它独立于外部库,如libc,如果需要使用内联汇编,可以在C / C ++中实现。