系统调用实现

如果用户应用程序进行系统调用,则会触发软件中断/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位系统调用号的列表。 您还需要通过其他寄存器( ebxecx等)将参数传递给系统调用,您可以在这里阅读更多信息。

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