今晚有点不在状态,就来总结一下在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;
}

执行结果如下,可以看到我们添加系统调用成功了~

Logo

更多推荐