Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 系统调用实现_Linux_Linux Kernel_System Calls - Fatal编程技术网

Linux 系统调用实现

Linux 系统调用实现,linux,linux-kernel,system-calls,Linux,Linux Kernel,System Calls,如果用户应用程序进行系统调用,则会触发软件中断/异常。如何查看生成软件中断的源代码?可以使用英特尔x86汇编指令int n触发软件中断,其中n是中断号。系统调用是软件中断的一种特殊情况;在中,您可以通过手动执行系统调用 mov eax, m int 0x80 其中,m应替换为中断号。以下是与每个功能的联机手册页链接的和的列表。您还需要通过其他寄存器(ebx,ecx,等等)将参数传递给系统调用,您可以阅读更多相关内容 这是进行系统调用最常用的方法,因为它独立于外部库(如libc),如果需要,可以

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

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

mov eax, m
int 0x80
其中,
m
应替换为中断号。以下是与每个功能的联机手册页链接的和的列表。您还需要通过其他寄存器(
ebx
ecx
,等等)将参数传递给系统调用,您可以阅读更多相关内容


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

很久以前,内核中有一个
int 0x80
陷阱,但现在首选
sysenter

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

$ cat /proc/self/maps 
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
有关更多信息,请查看中的说明。您应该阅读维基百科页面(以及关于),以及手册页。另见答案和一。还可以查看内部代码和源代码。还要学习使用
strace
找出给定命令或进程进行的系统调用


另请参阅与系统相关的应用程序和二进制接口规范。对于x86-64,它是。

您可能应该查看库源代码(例如libc、GNU libc或uClibc),而不是内核源代码。这是对一个一般问题的特定于实现的回答。链接已断开。最好直接引用内核源代码:现在仍然解释不推荐使用的
int0x80
,而不是syscall。@ceving:Yes。请随时为大会作出贡献,并说明如何改进大会。但我相信现在很少有人关心汇编,因为编译器提供了比人类编写的更好的代码,而且由于VDSO…这是完全一样的。只有数字和寄存器不同。退出(n)是
eax=60 edi=n系统调用,而不是
eax=1 ebx=n int0x80