Linux添加系统调用函数并编译

Linux添加系统调用函数并编译

1. 修改Linux内核

操作系统实验鸭

1.1 添加系统调用号

./arch/x86/entry/syscalls/syscall_64.tbl中加入系统调用号

1
2
3
333     64      helloworld              sys_helloworld
334 64 two sys_two
335 64 three sys_three

(333表示调用号,64代表64位程序)

DFKBE6.png

1.2 添加系统调用声明

./arch/x86/include/asm/syscalls.h文件中加入调用函数声明

1
2
3
asmlinkage void sys_helloworld(void);
asmlinkage void sys_three(void);
asmlinkage void sys_two(void);

Dixw7t.png

1.3 添加系统调用函数

/kernel/sys.c中添加系统调用函数

1
2
3
4
5
6
7
8
9
10
11
asmlinkage void sys_helloworld(void)
{
printk("helloworld\n");
}
asmlinkage void sys_two(void)
{
printk("it's my second function\n");
}
asmlinkage void sys_three(void){
printk("it's my thrid function\n");
}

Dize4f.png

2. 编译内核并安装内核

启动内核控制程序

1
2
apt-get install libncurses5-dev libncursesw5-dev
make menuconfig

DiVeR1.png

然后就可以对内核做一些配置了~

每一个配置选项都有三种选择:

  • [] 表示不将功能编译进内核
  • [M] 表示将该功能编译成动态插入内核的代码
  • [*] 直接将功能编译进内核

选好功能模块后就可以开始编译了

首先需要安装ssl

1
sudo apt-get install libssl-dev

然后编译安装

1
2
3
sudo make -j4
sudo make modules_install
sudo make install

如果没有什么报错就可以重启了~

1
reboot

开机后长按shift键,会进入如下界面,选择高级选项

DiiIne.png

在高级选项中选择刚刚编译号的4.14.200版本的内核

DiFPNn.png

这里我直接选择这个内核就会卡在开机画面,进不去,枯了,看到网上也有同学是一样的情况,可能是前面的步骤哪里有点问题,但是使用4.14.200的恢复模式就能进入系统(选择恢复模式后,选择resume),进入恢复模式后系统内核也重新更改了,那就这样叭 :-(

更改内核成功

1
uname -r

DiFI2V.png

3. 使用系统调用

编辑一个C语言程序:

1
2
3
4
5
6
7
8
9
#include <linux/unistd.h>
#include <sys/syscall.h>
int main()
{
syscall(333);
syscall(334);
syscall(335);
return 0;
}

然后编译一下~

1
gcc test.c

DiEMNj.png

我们的helloworld使用的是printk函数,是打印在日志中,所以我们首先清空一下日志

1
sudo dmesg -C

然后运行我们编译好的程序

1
./a.out

再查看日志

1
dmesg

DFK1EV.png

大功告成 :-)