Linux 实现自己增加系统调用

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

Guess you like

Origin blog.csdn.net/qq_43553690/article/details/120966992