修改内核代码添加函数,添加函数声明以及添加系统调用id,来实现给自己编译的内核添加系统调用。当然这个过程是在编译内核之前完成的,内核编译过程请参照Linux内核编译
添加系统调用
进入解压的文件目录
cd /usr/src/linux-5.1/kernel
在sys.c
中添加函数
执行vim sys.c
使用vim打开sys.c文件,未安装vim只需在终端执行sudo apt-get install vim
进行安装
在编辑状态下使用G
快速到达文件尾部,添加自定义函数
asmlinkage long sys_mySysFunction(void)
{
printk("Wang Haihua");
return 1;
}
添加函数声明
执行cd /usr/src/linux-5.1/arch/x86/include/asm
到asm文件目录下,执行vim syscalls.h
使用vim打开syscalls.h
文件添加声明
asmlinkage long sys_mySysFunction(void);
添加系统调用id
执行cd /usr/src/linux-5.1/arch/x86/entry/syscalls
到syscalls文件目录下,选择计算机对应的类型32位或64位,执行vim syscall_64.tbl
使用vim打开syscall_64.tbl
文件添加系统调用号
# <number> <abi> <name> <entry point>
428 64 mysyscall sys_mySysFunction
内核编译
请参照Linux内核编译
结果验证
编写程序调用自己添加的系统调用
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int result = syscall(428);
print("Successfully call sys_mySysFunction return %ld\n",result);
return 0;
}
mySystemcall.c
中使用syscall(428)
调用自定义添加的系统调用,返回值为sys_mySysFunction
函数中定义的73
,说明成功调用了该系统调用。
最后在终端使用dmesg
查看内核信息,看到自己定义的系统调用的打印信息