我正在阅读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的帮助。
答案 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
。