2

我正在向 linux Fedora 添加一些自定义系统调用,我目前正在尝试更新“syscall_32.tbl”。唯一的问题是我不太确定name调用表的字段是什么意思。

这是我们随便编的吗?就像我们决定调用这个特定系统调用的名称一样?

例如表的结构是:

<number> <abi> <name> <entry point> <compat entry point>

对于该<name>部分,这是我们决定并在那里输入的参数吗?或者它是更具体的东西,比如系统调用所在的文件名?

4

2 回答 2

6

内核中有一个系统调用表,列出了所有的系统调用及其实现函数。用户域通过指定系统调用的索引号来请求系统调用。因此,该索引号必须在内核编译和用户级代码编译之间匹配。由于这个列表维护起来很容易出错,所以引入了您找到的系统调用表,并从中自动生成代码。该表关联了系统调用:它们的索引号、在用户空间中使用的名称以及实现系统调用的内核函数名称。从这个表中,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)
于 2013-10-29T02:44:03.987 回答
0

您还可以在 strace 源代码中使用完整的系统调用列表及其相关系统调用号。例如对于 i386 系统,这里是链接:

strace sourceforge 中的 syscallent.h (i386)

于 2013-11-10T09:10:46.407 回答