[英]Where is the system call table in 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的帮助。
从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.
在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/
对于启用了审计的系统,可以使用以下方法轻松检索系统调用表:
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...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.