如果用户应用程序进行系统调用,则会触发软件中断/异常。如何查看生成软件中断的源代码?
答案 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 numbers和64-bit syscall numbers相关联的列表,这些列表链接到每个功能的在线联机帮助页。您还需要通过其他寄存器(ebx
,ecx
等)将参数传递给系统调用,您可以阅读有关here的更多信息。
这是进行系统调用的最常用方法,因为它独立于外部库,如libc,如果需要使用内联汇编,可以在C / C ++中实现。