4

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

4

3 回答 3

9

它在Linux Assembly Howto中有解释。您应该阅读 wikipedia系统调用页面(以及关于VDSO),以及intro(2)syscalls(2)手册页。另请参阅答案和答案。还可以查看Gnu Libcmusl-libc源代码。还可以学习使用strace来找出给定命令或进程进行了哪些系统调用。

另请参阅与您的系统相关的调用约定和应用程序二进制接口规范。对于 x86-64,它在这里

于 2012-10-08T19:18:42.467 回答
3

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

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

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

有关更多信息,请查看本文

于 2012-10-08T08:33:46.520 回答
1

可以使用 Intel x86 汇编指令触发软件中断int n,其中n是中断号。系统调用是软件中断的一种特殊情况;在您可以手动进行系统调用

mov eax, m
int 0x80

wherem应替换为中断号。下面是32 位系统调用号64 位系统调用号的列表,它们链接到每个函数的在线联机帮助页。您还需要通过其他寄存器(、、等)将参数传递给系统调用ebxecx您可以在此处阅读更多相关信息。

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

于 2012-10-08T07:21:23.393 回答