Linux内核中的系统调用表在哪里?

8
我正在阅读Robert Love的《Linux内核开发》,他其中一个练习是创建一个系统调用(第106页)。问题在于,我无法在x86_32体系结构的v3.9中找到系统调用表文件。我知道他使用的是2.6.xx版本,但我不知道这个版本是否适用于我正在使用的发行版,因为它相当古老,所以我更喜欢v3.9。
更多信息: 我所说的练习如下: 在系统调用表的末尾添加一个条目。这需要针对支持该系统调用的每个架构执行。(对于大多数调用,所有架构都支持)。从零开始,系统调用在表中的位置是其系统调用号。例如,列表中的第十个条目分配系统调用号九。
使用以下方法解决: 系统调用表位于arch / x86 / syscalls / syscall_32.tbl中,适用于x86体系结构。感谢Sudip Mukherjee的帮助。
另一种方法如下: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008598.html 感谢Srinivas Ganji的帮助。

你在哪里搜索它的? - mnagel
在这本书中,它说它位于entry.S中,但据我所知,在最新版本中已经更改了。因此,我在arch/x86/kernel中搜索,找到了entry_32.S文件,但我没有在那里找到表格。 - Iker
似乎在这里可以找到:http://lxr.linux.no/#linux+v3.9/arch/x86/ia32/syscall_ia32.c#L18 - levengli
在内核v3.0中,系统调用表似乎是在一个名为syscall_table_32.S的文件中,但我在v3.9中找不到它。来源:http://www.emntech.com/docs/syscall_emntech.pdf - Iker
4个回答

12

从 Linux 内核版本 4.2 开始,系统调用表已从 arch/x86/syscalls/syscall_64.tbl 移动到 arch/x86/entry/syscalls/syscall_64.tbl

这是相应的 提交记录

commit 1f57d5d85ba7f1f467173ff33f51d01a91f9aaf1
Author: Ingo Molnar <mingo@kernel.org>
Date:   Wed Jun 3 18:36:41 2015 +0200

    x86/asm/entry: Move the arch/x86/syscalls/ definitions to arch/x86/entry/syscalls/

    The build time generated syscall definitions are entry code related, move
    them into the arch/x86/entry/ directory.

8
在src根目录下创建一个测试文件夹:src/linux-3.4/testing/,然后将以下文件放入此文件夹中:
- 包含系统调用代码的文件:strcpy.c
#include <linux/linkage.h>
#include <linux/kernel.h>
asmlinkage long sys_strcpy(char *dest, char *src)
{
    int i=0;
    while(src[i]!='\0') {
        dest[i]=src[i++];
    }
    dest[i]='\0';
    printk(" Done it ");
    return 0;
}

需要创建一个包含以下行的Makefile:

obj-y:=strcpy.o

向系统调用表中添加一个条目和函数的原型:
- 通过将此行添加到空闲的223条目,编辑文件src/linux-3.4/arch/x86/syscalls/syscall_32.tbl

 223        i386    strcpy          sys_strcpy

通过添加函数的原型,编辑文件src/linux-3.4/include/linux/syscalls.h

asmlinkage long sys_strcpy(char *dest, char *src);

在 src 根目录下编辑主 Makefile 文件(src/linux-3.4/Makefile),将之前创建的 testing 文件夹添加进去,如下所示:
core-y      += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ testing/

4

对于启用审计的系统,可以轻松地检索系统调用表:

ausyscall --dump

例如:

$ ausyscall --dump

Using x86_64 syscall table:
0   read
1   write
2   open
3   close
4   stat
5   fstat
6   lstat
7   poll
8   lseek
9   mmap
10  mprotect
...SNIP...

0
一个类似的问题在SO上,OP似乎已经解决了它:
{{link1:New syscall not found(linux kernel 3.0.0)我应该从哪里开始寻找?}}
文件似乎是arch/x86/kernel/syscall_table_32.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接