Linux添加系统调用详解
今晚有点不在状态,就来总结一下在Linux中添加一个系统调用吧,示例平台Ubuntu 1604 64位,内核版本linux-4.4.4欢迎大家评论交流,题主从linux-2.6一直到linux-4.15的内核都添加过系统调用,各个大版本之间添加系统调用还是有一定区别。现在以linux-4.4.4添加系统调用为例进行一下记录~关于内核的下载与编译可以参考博文:https://blog.c...
今晚有点不在状态,就来总结一下在Linux中添加一个系统调用吧,示例平台Ubuntu 1604 64位,内核版本linux-4.4.4
欢迎大家评论交流,题主从linux-2.6一直到linux-4.15的内核都添加过系统调用,各个大版本之间添加系统调用还是有一定区别。现在以linux-4.4.4添加系统调用为例进行一下记录~
关于内核的下载与编译可以参考博文:
https://blog.csdn.net/SweeNeil/article/details/83684565
这里直接来添加系统调用。
1、添加系统调用代码
进入到自己对应的linux内核源码的kernel目录下,例如我的kernel目录为
/usr/src/linux-4.4.4/kernel
添加系统调用源码有两种方式:
1)可以自己添加文件
2)在kernel目录下已有的文件中添加自己的代码(一般在sys.c中添加)
这两种方法的差别在于1)需要修改Makefile文件,而2)不需要。
如果代码量大可以自己定义文件,在这里我采用第一种方式,以自己写的文件的形式添加。在kernel目录下编写swee.c
#include <linux/kernel.h>
asmlinkage long sys_swee (int data)
{
printk("\nSWEE:This is the sys_swee!\n");
printk("SWEE: data is %d \n",data);
return 0;
}
2、修改Makefile文件
如果直接在kernel/sys.c中添加的代码那就直接跳到第3步。
修改Makefile就添加如上所示的一个与你自己添加的.c文件同名的.o即可。
3、在头文件中声明
进入到源码的/include/linux目录,我这里是
/usr/src/linux-4.4.4/include/linux
在里面找到syscalls.h文件,进入添加我们定义的系统调用声明
如上图红框中所示。
4、注册系统调用
进入linux源码目录 /arch/x86/entry/syscalls,我这里是
/usr/src/linux-4.4.4/arch/x86/entry/syscalls
可以看到里面有如下内容
32位系统就添加到syscall_32.tbl,64位就修改syscall_64.tbl
我这里是64位,因此我进入到syscall_64.tbl中
按着顺序往下添加即可,中间使用Tab键分隔。
5、编译内核安装
这一步同样参考最开始的博文,至此一个系统调用就写好了。编译安装完成后切换到我们编译的内核。
6、测试
创建test.c文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
syscall(328,10);
return 0;
}
执行结果如下,可以看到我们添加系统调用成功了~
更多推荐
所有评论(0)