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

时间:2013-07-15 10:54:18

标签: linux kernel

我正在阅读Robert Love的Linux内核开发,他所做的一项练习是创建一个系统调用(第106页)。问题是我无法在v3.9中找到x86_32体系结构的系统调用表文件。我知道他正在使用2.6.xx版本,但我不知道该版本是否适用于我正在使用的版本,因为它很旧,所以我更喜欢v3.9。

更多信息: 我所说的演习如下: 在系统调用表的末尾添加一个条目。这需要为支持系统调用的每个体系结构完成(对于大多数调用,这是所有体系结构)。系统调用在表中的位置,从零开始,是它的系统呼叫号码。例如,列表中的第十个条目被分配了系统调用号9。

使用以下方法解决: 系统调用表位于x86架构的arch / x86 / syscalls / syscall_32.tbl中。感谢Sudip Mukherjee的帮助。

另一种方法如下: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008598.html 感谢Srinivas Ganji的帮助。

4 个答案:

答案 0 :(得分:11)

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

以下是相应的commit

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.

答案 1 :(得分:7)

在src root: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

在syscall表和函数原型中添加一个条目:
- 通过将此行添加到免费的条目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根目录(src/linux-3.4/Makefile)中的主Makefile,如下所示:

core-y      += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ testing/

答案 2 :(得分: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...

答案 3 :(得分:0)

一个关于SO的类似问题OP似乎解决了它:

New syscall not found (linux kernel 3.0.0) where should I start looking?

该文件似乎是arch/x86/kernel/syscall_table_32.c