【问题标题】:What does the "name" parameter mean in the syscall_32.tbl linux file?syscall_32.tbl linux 文件中的“name”参数是什么意思?
【发布时间】:2013-11-10 17:10:46
【问题描述】:

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

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

例如表的结构是:

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

对于&lt;name&gt; 部分,这是我们决定并在此处输入的参数吗?或者它是更具体的东西,比如系统调用所在的文件名?

【问题讨论】:

  • 当我几年前尝试时,如果不重新编译内核,系统调用是不可能扩展的。你在写模块吗?

标签: linux-kernel system-calls


【解决方案1】:

内核中有一个系统调用表,列出了所有的系统调用及其实现函数。用户域通过指定系统调用的索引号来请求系统调用。因此,这个索引号必须在内核编译和用户级代码编译之间匹配。由于这个列表维护起来很容易出错,所以引入了您找到的系统调用表,并从中自动生成代码。该表关联了系统调用:它们的索引号、在用户空间中使用的名称以及实现系统调用的内核函数名称。从这个表中,Makefile 生成了头文件。

有一个头文件syscalls_xx.h,它定义了内核中的表(它通过索引列出了所有实现系统调用的内核函数)。

还有另一个头文件unistd_xx.h,它为用户区提供#define,按名称列出系统调用索引号。您要求的 name 字段将进入此列表,用户区可以通过该列表引用此系统调用:__NR_&lt;xxx&gt;。这个头文件被复制并在用户空间代码中使用,以便系统调用索引号可以通过名称引用(参见 glibc 源代码,这些是如何使用的)。

syscall_32.tbl:

350     i386    finit_module            sys_finit_module

unistd_32.h:

#define __NR_finit_module 350

syscalls_32.h:

__SYSCALL_I386(350, sys_finit_module, sys_finit_module)

【讨论】:

  • 好的,所以名称本质上是映射到系统调用的用户级函数名称。所以我可以编写一个 c 文件并使用 name*(*needed arguments) 其中 name 是一个特定的系统调用名称而不是入口点名称......对吗?
  • 不,你不必这样做。这些名称是#define 标签中使用的字符串。您可以随意命名您的用户空间函数 - 在该函数中,您将使用该头文件中的#define 标签,别无其他。
【解决方案2】:

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

syscallent.h (i386) in strace sourceforge

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多