Linux 实现自己增加系统调用
实验环境:
- 银河麒麟桌面操作系统V10(SP1)
- openEuler-20.03-LTS-SP2-x86_64-dvd.iso
- linux-5.4.54.tar.xz 内核文件
首先,通过scp把linux-5.4.54.tar.xz上传到虚拟机上面
sudo scp linux-5.4.54.tar.xz 172.18.0.10:/home/kevin
然后把压缩包进行解压
tar xvf linux-5.4.54.tar.xz
然后进到文件夹里面
cd linux-5.4.54
添加我们自己的系统调用
vim arch/x86/entry/syscalls/syscall_64.tbl
然后Shift + G
在最后一行添加(注意:common的那个地方 64测试过 无法正常编译所以要写common,x32未测试)
548 common mycall compat_sys_mycall
然后按一下Esc 输入 :(英文冒号) ,按一下wq! 就退出了
接着修改
vim include/linux/syscalls.h
在 #endif 的上面一行加上
asmlinkage long compat_sys_mycall(void);
和上面一样,然后按一下Esc 输入 :(英文冒号) ,按一下wq! 就退出了
还要修改
vim kernel/sys.c
在 #endif 的上面一行加上
asmlinkage long compat_sys_mycall(void)
{
printk("Hello World");
return 0;
}
和上面一样,然后按一下Esc 输入 :(英文冒号) ,按一下wq! 就退出了
再和之前一样
make menuconfig
在General setup —>下面的 Local version - append to kernel release
写上自己的名字 我写的是 :-2.0-KevinPro
然后 最下面 save 保存后退出 exit
然后就可以开始编译了(耗时较长)
make -j4
安装模块
make modules_install
然后就开始安装
make install
最后重启
reboot
就可以了,但是应该怎么测试是否真的成功呢
我们可以编写一个C语言的代码
cd /home/kevin
vim testSystemCall.c
#include<unistd.h>
#include<stdio.h>
#include<sys/syscall.h>
#include<linux/kernel.h>
int main(){
long int a = syscall(548); //这个调用号对应了上面加的号码
printf("It is %d",a);
return 0;
}
然后进行编译
gcc testSystemCall.c -o testSystemCall
运行
./testSystemCall
结果返回0
最后,在日志中看到,我们的系统调用就算成功啦
dmesg