向内核中添加代码其实很简单,但是不推荐,只做学习内核用
一、在kernel目录下新建一个myapi.c文件,文件内容就是相关的系统调用实现的代码
#include<linux/kernel.h>
#include<linux/linkage.h>
asmlinkage long sys_userlog(void)
{
printk("hello I'm a new syscall \n");
return 0;
}
二、在kernel目录下的makefile中的obj-y后面添加myapi.o
三、在include/linux/syscall.h中添加函数声明
asmlinkage long sys_userlog(void)
四、在arch/x86/include/asm/unistd_32.h中添加宏
#define __NR_userlog 349 //数字是从上往下排下来的
#define NR_syscalls 350 //350为原来的数字加1因为添加了一个新的syscall 所有syscall总数加1
五、在arch/x86/kernel/syscall_table_32.S中添加
.long sys_userlog
以上操作就是一个新的syscall添加的完整过程
一下为测试程序
在写测试程序前需要重新编译并加载内核
测试程序如下
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <stdio.h>
#define __NR_userlog 349
int main()
{
printf("%d \n",__NR_userlog);
int t=10;
printf("t is %d before calling a syscall",t);
t=syscall(__NR_userlog);
printf("t is %d\n",t);
return 0;
}
程序执行结果如下
在用dmesg命令查看printk的输出,可以看到
可以看到我们新添加的syscall成功执行了