Linux添加系统调用(编译内核法)学习心得
如果放在一个月前,我肯定不敢相信我自己竟然可以安装双系统,竟然可以修改系统的代码。而这都真实的发生了。怀着激动的心情写下这篇记录,明白了只要去做,没有什么事情是做不到的。
为Linux系统添加系统调用,对于刚刚接触到Linux的我来说简直是impossible。就连联网改输入法都废了牛劲,不知道这次要经过多少困难。首先是了解什么是系统调用,百度一下,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。 系统调用提供了用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。 那么添加系统调用,简单来说就是向内核写入你自己的函数操作,之后的程序可以直接调用你创造的函数。
既然要编译内核,那么首先要有一个内核。我下载的是Linux-4.16.9的内核,并且把它提取保存到/usr/src中去。
第二步 修改内核代码
把你自己创造的代码写进Linux系统内核中,听起来好像很高大上,那么就一起来做一遍。在下面所有的修改添加过程中,可以使用终端操作,当然也可以直接对文件修改。对于我这样的小白来说就一点点找文件修改了,有能力的同学试着终端操作更快捷。
1. /arch/x86/entry/syscalls/syscall_64.tbl(64位)
在该路径下,我们要设置系统调用号。
在第332条加入第333条系统调。如图
2. /include/linux/syscalls.h
该路径下在系统调用的头文件中添加函数声明。
在最后一行 #endif前输入声明并保存。如图
3. /kernel/sys.c
在该路径下实现函数。
输入函数及实现方法并保存。如图
这样3步操作后,我们对内核的修改已经完成。下面就是编译内核!!
第三步 编译内核
1. 首先要进入你的内核文件
我的是 cd /usr/src/linux-4.16.9,然后进行后续操作。
2. 输入 sudo make menuconfig 一般情况下会出现一些错误,我就是出现了许 多错误,搞得自己焦头烂额,不过在百度和班里大佬帮助下,最终还是解决了。这里就分享 一下我遇到的错误。
第一个错误是告诉我缺少ncures 库
既然是缺少那么我们就安装
输入命令 sudo apt-get install libncurses5-dev libssl-dev
之后就按流程按Y安装,这个问题就解决了。
再次输入命令sudo make menuconfig 运行,又出了错误!!
看错误报告原来是 bison not found,和大佬商量过后感觉是不是要尝试安装一下 bison。
输入 sudo apt-get install bison运行安装
再一次执行 sudo make menuconfig 终于成功了!!
当然,还有的同学反应会报出flex not found的问题,虽然我没有遇到,但还是说一下,install个flex就可以了。
一切就绪弹窗进入menuconfig界面
直接选择save,完成之后退出。
3. 输入 sudo make 命令,进行编译。
还没运行一会,又又又出现错误!!
告诉我又缺少驱动,有了之前的经验,果断按要求安装(人家都请你安装了,怎能不按),完成之后继续sudo make。
好像没有错误了,进入了漫长的运行中,抬头看表已经将近凌晨1点,不等了,睡觉,自己运行去吧。
4. 早上起来已经完成了,进入下一步。
输入 sudo make modules_install 安装一些驱动和功能
顺利进行
5. 最后一步啦 输入命令 sudo make install 把内核安装到系统中
长出一口气,顺利完成,编译内核添加系统调用已经基本完成。
下面我们来检验一下成果。
重启电脑,这时要注意了,不再是以前那样进入ubuntu了,第二个选项有一个ubuntu高级选项,点击进入。会出现下图情况,选择第二个进入。
之后电脑会载入初始化,等一会就好了。
进到了ubuntu主界面,下面要测试一下成果。
使用vim创建一个 .c文件(vim安装和操作不再多讲,不明白可查询百度),当然,也可以直接在home目录里创建一个 .c文件,作为测试的代码。
完成后保存。
之后使用 gcc 编译运行该文件。如果计算机没有gcc,那么就安装一个
输入 sudo apt-get build-depgcc
sudo apt-get install build-essential
安装好之后执行命令 gcc tanbowen.c(你的.c文件名字)
./a.out
可以看到函数运行结果,结果正确。
到这里算是全部完成任务,虽然说遇到了很多问题,但是还是都解决了。总结一下,因为版本不同,过程中会安装许多驱动,每个人或许有不同,看到错误不要着急,慢慢分析,多查资料多和别人交流,最终都会解决的。感谢班里大佬的帮助,很高兴能有这么一次机会进一步了解Linux,Linux系统还有很多东西需要我去学习,很期待下一次的挑战。