编译内核法在Ubuntu内增加一条系统调用

前几周,操作系统原理的老师布置了一项作业,“在Linux系统内增加一条系统调用”。刚听到这个作业时,我是很懵的,完全不知道咋办(毕竟当时连系统调用的概念都没有太深的体会)。于是,开始疯狂搜集资料、查阅博客及各种教程,一步步搞,慢慢尝试,终于成功了(说的好似很轻松,其实中间经历了蛮多波折滴)。具体步骤如下:(事先声明,我安的是双系统~)
1、先进行一系列的准备配置工作,安装相关依赖。(不然,以后就会遇到各种问题。当然,遇到问题,再解决也可以。但是,还是先准备好,之后的步骤会顺利一些。)
打开终端,输入下列命令:
sudo apt-get update
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install bison
sudo apt-get install flex

相关依赖安装完成
2、我采用的是重新编译内核的方法,那么,就要有一个新的内核。这里,去官网之类的下载就好啦。有好多版本,我下载的是4.18.3(我觉得吧,尽量别下太老的版本,就莫得问题了)。下载之后,得到了一个压缩包。
在这里插入图片描述
解压,得到文件夹。
在这里插入图片描述
使用sudo mv linux-4.18.3 /usr/src命令,将该文件夹移动至/usr/src(注意中间的空格,不然就会出现如图的错误)。
在这里插入图片描述
2、开始增加新的系统调用啦
找到/usr/src/linux-4.18.3/arch/x86/entry/syscalls/syscall_64.tbl
在这里插入图片描述
打开,添加自定义的系统调用的调用号,然后保存,这里我的是335
在这里插入图片描述
找到/usr/src/linux-4.18.3/include/linux/syscalls.h
在这里插入图片描述
打开,在末尾添加自定义函数的声明,一定要注意加在#endif之前呀,然后保存
在这里插入图片描述
找到/usr/src/linux-4.18.3/kernel/sys.c
在这里插入图片描述
打开,在末尾加入函数的定义(自由发挥就好啦,想实现什么就写什么),还是要注意加在#endif之前呀,然后保存
在这里插入图片描述
(以上打开待编辑文档,都可以通过gedit命令实现的,不过,我是直接人工找的)
·小插曲
开始尝试时,我没注意到函数定义的实现,想当然地照着声明的样子,写成了如下形式
在这里插入图片描述
还觉得自己对得很,继续之后的步骤,编译内核过程中出现了错误,“__x64_sys_mycall未定义的引用”
在这里插入图片描述
看了好久,咦,声明和定义都写了呀,为啥会这样,仔细看发现是我函数定义格式不对,赶紧修改
3、增加一条自定义的系统调用完成,接下来进行编译内核前的准备配置
输入cd /usr/src/linux-4.18.3命令,定位到刚移动好的那个文件夹,一定要注意,cd后面有个空格呐,不要看漏了,千万不要看漏了(多说一遍)
输入sudo make mrproper命令,清除编译过程中所有的中间文件
输入sudo make clean命令,清除上一次编译的中间文件
在这里插入图片描述
输入sudo make menuconfig命令,出现如下界面
在这里插入图片描述
默认配置的话,直接Exit,然后保存即可(如果有特殊配置要求,自行选择后,再保存)
在这里插入图片描述
4、准备配置完毕,开始编译内核
输入sudo make -j4命令,这里也可以直接sudo make,不过太太太慢了,后面的数字4是因为我的电脑CPU是4核,可以根据自己电脑的情况自行改动
在这里插入图片描述
然后,就开始编译内核了,这个过程蛮久的,我等了大概一个小时,可以先干点其他事情
在这里插入图片描述
(过程中可能会遇到问题,不要泄气呀,再网上查找解决方案,再次尝试)
编译完成后,生成新的内核
输入sudo make modules_install命令,安装内核模块
在这里插入图片描述
输入sudo make install命令,安装内核
在这里插入图片描述
到这里编译内核成功,给自己鼓个掌先
5、重启计算机,这一次选择Ubuntu高级选项
在这里插入图片描述
选择新编译的那个内核启动系统(就是看版本号啦)
在这里插入图片描述
·大插曲
就在我以为离成功只有半步了的时候,啊,突然出现的问题吓到了我
在这里插入图片描述
这是怎么回事呢,刚刚的过程都成功了呀。然后,开始查资料、问同学。天呐,并没有查到相关资料,同学也表示没有见过这个问题,心里很是抓狂,不知道该怎么办(小声说,我甚至重新编译了一次内核,无果)。折腾了好久,终于,在我很沮丧地继续搜资料的时候,看到了一个有些类似的关于“invalid signature”的问题,抱着试试看的心态,我试了该解决方案,竟然成功了,巨开心!
方法就是,开机时进入BIOS,将Secure Boot改为disable,保存,然后重启。出现的问题貌似是因为,它有防止安装Windows操作系统的电脑更改Linux的作用。(这个解决方法,安全性未知,如果大家没有遇到这个问题,不建议随意修改。)
6、测试新增一条系统调用是否成功
输入sudo gedit test.c命令,新建一个文本文档,写一个调用自定义的系统函数的程序,并保存
在这里插入图片描述
输入
sudo gcc -o test test.c
sudo ./test
命令,运行该程序
可以看到,输出的返回值就是我所定义的函数返回值
在这里插入图片描述
输入sudo dmesg命令,查看系统进程
在这里插入图片描述
成功输出函数定义中的内容,即宣告此次用编译内核法给Ubuntu增加一条系统调用圆满成功。
在这个过程中,虽说有时看到各种问题,有点小心累,但现在回想一下,真的是收获满满。感谢同学们和老师给予的帮助呀,也感谢之前写出很具体操作流程的作者们,站在他们的肩膀上,我才得以成功完成。加油呀,看到这里的你们。继续努力,不要放弃,相信你也可以做到哒。经过努力然后成功的那一刻,真的是无比开心滴。
最后,第一次写博客,如果发现问题,欢迎大家提出呦!

参考博文
【1】https://blog.csdn.net/t5198/article/details/80394041
【2】https://blog.csdn.net/qq_36172505/article/details/80372029
【3】https://blog.csdn.net/qq_42606750/article/details/88621141

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值