8

我正在阅读 Robert Love 的 Linux Kernel Development 并且他所做的一个练习是创建一个系统调用(第 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

4 回答 4

12

从 linux kernel 4.2 开始,系统调用表已经从 移动arch/x86/syscalls/syscall_64.tblarch/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.
于 2015-10-30T16:13:32.363 回答
8

在 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

向系统调用表和函数原型添加一个条目: -通过将此行添加到空闲的条目 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/
于 2014-03-01T20:24:03.287 回答
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...
于 2018-06-19T22:28:15.557 回答
0

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

未找到新的系统调用(linux 内核 3.0.0)我应该从哪里开始寻找?

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

于 2013-07-18T09:21:36.827 回答