Linux添加系统调用函数并编译
1. 修改Linux内核
操作系统实验鸭
1.1 添加系统调用号
在./arch/x86/entry/syscalls/syscall_64.tbl
中加入系统调用号
1 | 333 64 helloworld sys_helloworld |
(333表示调用号,64代表64位程序)
1.2 添加系统调用声明
在./arch/x86/include/asm/syscalls.h
文件中加入调用函数声明
1 | asmlinkage void sys_helloworld(void); |
1.3 添加系统调用函数
在/kernel/sys.c
中添加系统调用函数
1 | asmlinkage void sys_helloworld(void) |
2. 编译内核并安装内核
启动内核控制程序
1 | apt-get install libncurses5-dev libncursesw5-dev |
然后就可以对内核做一些配置了~
每一个配置选项都有三种选择:
[]
表示不将功能编译进内核[M]
表示将该功能编译成动态插入内核的代码[*]
直接将功能编译进内核
选好功能模块后就可以开始编译了
首先需要安装ssl
1 | sudo apt-get install libssl-dev |
然后编译安装
1 | sudo make -j4 |
如果没有什么报错就可以重启了~
1 | reboot |
开机后长按shift键,会进入如下界面,选择高级选项
在高级选项中选择刚刚编译号的4.14.200
版本的内核
这里我直接选择这个内核就会卡在开机画面,进不去,枯了,看到网上也有同学是一样的情况,可能是前面的步骤哪里有点问题,但是使用
4.14.200
的恢复模式就能进入系统(选择恢复模式后,选择resume
),进入恢复模式后系统内核也重新更改了,那就这样叭 :-(
更改内核成功
1 | uname -r |
3. 使用系统调用
编辑一个C语言程序:
1 |
|
然后编译一下~
1 | gcc test.c |
我们的helloworld
使用的是printk
函数,是打印在日志中,所以我们首先清空一下日志
1 | sudo dmesg -C |
然后运行我们编译好的程序
1 | ./a.out |
再查看日志
1 | dmesg |
大功告成 :-)