我正在向 linux Fedora 添加一些自定义系统调用,我目前正在尝试更新“syscall_32.tbl”。唯一的问题是我不太确定name
调用表的字段是什么意思。
这是我们随便编的吗?就像我们决定调用这个特定系统调用的名称一样?
例如表的结构是:
<number> <abi> <name> <entry point> <compat entry point>
对于该<name>
部分,这是我们决定并在那里输入的参数吗?或者它是更具体的东西,比如系统调用所在的文件名?
我正在向 linux Fedora 添加一些自定义系统调用,我目前正在尝试更新“syscall_32.tbl”。唯一的问题是我不太确定name
调用表的字段是什么意思。
这是我们随便编的吗?就像我们决定调用这个特定系统调用的名称一样?
例如表的结构是:
<number> <abi> <name> <entry point> <compat entry point>
对于该<name>
部分,这是我们决定并在那里输入的参数吗?或者它是更具体的东西,比如系统调用所在的文件名?
内核中有一个系统调用表,列出了所有的系统调用及其实现函数。用户域通过指定系统调用的索引号来请求系统调用。因此,该索引号必须在内核编译和用户级代码编译之间匹配。由于这个列表维护起来很容易出错,所以引入了您找到的系统调用表,并从中自动生成代码。该表关联了系统调用:它们的索引号、在用户空间中使用的名称以及实现系统调用的内核函数名称。从这个表中,Makefile
生成头文件。
有一个头文件syscalls_xx.h
,它定义了内核中的表(它通过索引列出了实现系统调用的所有内核函数)。
还有另一个头文件unistd_xx.h
,它为#define
用户区提供 's,按名称列出系统调用索引号。您询问的名称字段将进入此列表,用户区可以通过该列表引用此系统调用:__NR_<xxx>
. 该头文件被复制并在用户空间代码中使用,以便系统调用索引号可以通过名称引用(请参阅 glibc 源代码,如何使用它们)。
syscall_32.tbl:
350 i386 finit_module sys_finit_module
unistd_32.h:
#define __NR_finit_module 350
系统调用_32.h:
__SYSCALL_I386(350, sys_finit_module, sys_finit_module)
您还可以在 strace 源代码中使用完整的系统调用列表及其相关系统调用号。例如对于 i386 系统,这里是链接: