一、写作目的
这次给大家分享下怎么在Ubuntu上自己添加系统调用。之前已经写过怎么在Ubuntu 18.04上自己编译并且[安装内核],这次承接上次的操作,在Ubuntu 18.04+内核4.18.14上添加系统调用。
二、操作步骤
- 在文本结尾增加自己的系统调用函数和其对应的系统调用编号
执行以下命令:
1 | /usr/src/linux-4.18.14/arch/x86/entry/syscalls #内核源代码所在根目录 |
先列出自定义的系统调用目标相关信息:
1 | 目标函数声明:long sys_HelloWorld(void) |
注:如果是仅支持32位系统的系统调用,系统调用编号不得小于512
故添加的系统调用如下图所示:
保存并退出
- 添加系统调用函数的声明
执行以下命令:
1 | cd /usr/src/linux-4.18.14 |
在打开的文章末尾(endif 前面)加入自定义函数的声明
保存并退出
- 添加系统调用函数定义
执行以下命令:
1 | cd /usr/src/linux-4.18.14 |
在打开的文章末尾(endif 前面)加入自定义函数的定义部分,注意,打印用内核函数”printk”
保存并退出
- 编译内核
输入以下指令:
1 | sudo make clean #清理之前的编译残留 |
三、验收成果
- 编写如下C代码
首先进入路径,创建测试代码
1 | #首先执行下面两行命令 |
test.c中内容如下,保存后退出
1 | #include <linux/kernel.h> |
- 编译并运行代码
1 | sudo gcc -o test test.c |
你将会看到如下所示结果:
注:第二个函数参数尚未正常传递,所以看到是“随机数”,感谢热心的朋友在评论区提醒,后续经过验证,是因为Ubuntu的内核版本曾经在某一版本以后有所变化导致此方法失效,经验证 14.04版本可行
**最后,如果你经过上面的步骤依旧不能成功(比如总是返回-1),建议查看下系统内核版本(uname -a),也许你在32位系统上添加了64位调用**