介绍
就是添加一个自定义的系统调用,类似于read write这种
环境
linux-5.12.6-arch1-1.0
内核:linux-5.12.6
下载地址:www.kernel.org
修改
大概有5个文件需要修改
kernel/sys.c
include/linux/syscalls.h
include/uapi/asm-generic/unistd.h
arch/x86/entry/syscalls/syscall_64.tbl
arch/x86/entry/syscalls/syscall_32.tbl
定义系统调用
打开文件
vim kernel/sys.c
添加一下代码
SYSCALL_DEFINE1(mycall, int __user* ,arg)
{
printk("this is mycall\n");
return 0;
}
声明系统调用
打开文件
vim include/linux/syscalls.h
添加
asmlinkage long sys_mycall(int __user* ,arg);
添加对应编号
打开文件syscall_64.tbl
vim arch/x86/entry/syscalls/syscall_64.tbl
最后编号处添加
xxx common mycall sys_mycall
这里的xxx是编号,自行修改
打开文件vim arch/x86/entry/syscalls/syscall_32.tbl
vim arch/x86/entry/syscalls/syscall_32.tbl
最后编号处添加
xxx i386 mycall sys_mycall
这里的xxx是编号,自行修改
unistd.h修改
#define __NR_mycall xxx
__SYSCALL(__NR_mycall, sys_mycall)
然后修改下边的总值
#define __NR_syscalls xxx+1
这里的xxx是编号,自行修改
配置
make clean && make mrproper
make localmodconfig #这里直接两下回车
make menuconfig #回车然后修改下边Bzip2
make -j16
make modules_install
cp -v arch/x86/boot/bzImage /boot/vmlinuz-5.12.6
cp System.map /boot/System.map-5.12.6
mkinitcpio -k 5.12.6 -g /boot/initramfs-5.12.6.img
grub-mkconfig -o /boot/grub/grub.cfg
然后就可以重启了,重启通过高级选项进入刚刚编译好的内核
测试
#include <stdio.h>
#include <stdlib.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
//这里xxx是刚刚传的数字
syscall(xxx, NULL);
return 0;
}
打印结果
this is mycall
ps:如果参数为结构体记得在syscalls.h中声明一下