如果用户应用程序进行系统调用,则会触发软件中断/exception。 如何查看生成软件中断的源代码?
这在Linux Assembly Howto中有解释。 你应该阅读维基百科的系统调用页面(还有关于VDSO )以及介绍(2)和系统调用(2)手册页。 另请参阅此答案和这一个。 也看看Gnu Libc和musl-libc的源代码。 还要学习使用strace
来查找给定的命令或进程创建哪些系统调用。
另请参阅与您的系统相关的调用约定和应用程序二进制接口规范。 对于x86-64,它在这里 。
很久以前,有一个int 0x80
陷阱进入内核,但是现在sysenter
是首选。
你可以通过转储由内核自动映射到每个进程的vsyscall
节来获得代码。
$ cat /proc/self/maps blah blah blah ... blah blah blah ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
有关更多信息,请查阅本文
软件中断可以通过Intel x86汇编指令int n
来触发,其中n
是中断编号。 系统调用是软件中断的特例, 在你可以手动做一个系统调用
mov eax, m int 0x80
其中m
应该用中断号代替。 以下是链接到每个函数的在线联机帮助页的32位系统调用号和64位系统调用号的列表。 您还需要通过其他寄存器( ebx
, ecx
等)将参数传递给系统调用,您可以在这里阅读更多信息。
这是执行系统调用的最通用的方法,因为它独立于libc之类的外部库,如果需要使用内联汇编,则可以在C / C ++中实现此功能。