系统调用的实现

4

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


2
你应该查看库源代码(例如libc,无论是GNU libc还是uClibc),而不是内核源代码。 - sawdust
3个回答

9

现在,Linux汇编教程仍然解释了已弃用的int 0x80而不是syscall。 - ceving
@ceving:是的。随意为那个汇编指南做出贡献以改进它。但我相信现在很少有人关心汇编,因为编译器可以生成比人类写得更好的代码,还有VDSO的存在... - Basile Starynkevitch
1
它们非常相似,只是数字和寄存器不同。exit(n)eax=60 edi=n syscall 而不是 eax=1 ebx=n int0x80 - ceving

3
很久以前,有一个“int 0x80”陷阱用于进入内核,但现在更倾向于使用“sysenter”。您可以通过转储内核自动映射到每个进程中的“vsyscall”部分来获取代码。
$ cat /proc/self/maps 
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

如需更多信息,请查看此文章


1
软件中断可以通过Intel x86汇编指令int n触发,其中n是中断号。系统调用是软件中断的一种特殊情况;在中,您可以手动执行系统调用。
mov eax, m
int 0x80

在这里,m 应该被替换为中断号。这里有 32 位系统调用号64 位系统调用号 的列表,它们链接到每个函数的在线手册。你还需要通过其他寄存器(如 ebxecx 等)传递参数给系统调用,并且你可以在 这里 阅读更多相关信息。

这是最通用的进行系统调用的方式,因为它不依赖于外部库,如 libc,如果需要,你可以使用内联汇编在 C/C++ 中实现它。


这是一个特定于实现的答案,针对一个普遍的问题。 - Chris Stratton
3
链接已经失效,最好直接参考内核源代码:32位64位 - ceving

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接