实验科目:操作系统
实验名称:向Linux内核增加一个系统调用
今天下午做了个实验,实验内容本身不难,但是环境的配置、内核的编译、kernel源码的安装真的是要了老命了,这个实验本来在前几周就该完成(跟着网课的进度是这样的),但是由于我之前比较熟悉和钟爱VB虚拟机,而VB对于共享文件这块实在不敢夸奖,所以正好前几天装了VM也配了CentOS的镜像上去了,今天就把这个实验做了吧,没想到的是,这个实验差点把自己送走。
下面开始:
首先我们先从www.kernel.org网站上,下载相关版本的linux内核源码,我这里下载的是4.18.14版本(附上地址:http://ftp.jaist.ac.jp/pub/Linux/kernel.org/linux/kernel/v4.x/linux-4.18.14.tar.gz)。这里可能大家下载的时候就比较烦躁了,如果不挂代理下载,几十B/s的下载速度能让你现在就直接放弃,因为我是百度网盘的会员,所以挂在网盘上离线下载,速度很nice。下载完成之后,将该文件放在windows与vmware的共享文件夹路径下。(这里需要大家先下载一下vm tools再开启共享文件夹的使用,我就不po教程了,网上有)
进入 /mnt/hgfs目录下(默认的共享文件目录)
![](https://img.haomeiwen.com/i19702940/c899bee0800ebc96.png)
发现我们下载好的内核文件在里面。
将该文件剪切到/usr/src目录下:(这里需要root权限并且需要点时间,内核文件还是挺大的)
![](https://img.haomeiwen.com/i19702940/15d3ddfd15440684.png)
接着进入内核文件目录里:
![](https://img.haomeiwen.com/i19702940/0b3605eaeaeabdd5.png)
打开编辑kernel/sys.c去添加自己的函数:vim kernel/sys.c
![](https://img.haomeiwen.com/i19702940/f23183f5e7175e0c.png)
自定义函数了,就得添加声明:vim arch/x86/include/asm/syscalls.h
![](https://img.haomeiwen.com/i19702940/0148581ed3d6bc51.png)
![](https://img.haomeiwen.com/i19702940/26aaa06338202df2.png)
添加调用号:vim arch/x86/entry/syscalls/syscall_64.tbl
![](https://img.haomeiwen.com/i19702940/d8ba59551bbcc97d.png)
![](https://img.haomeiwen.com/i19702940/aec1fe7730727183.png)
下面我们把没用的文件删去:
sudo make mrproper
sudo make clean
(可能会报错没有安装gcc,导致make命令执行不了)
安装下gcc和c++编辑器以及内核编译
![](https://img.haomeiwen.com/i19702940/db1fed4c29597ac3.png)
接着配置:
sudo make menuconfig:
发现爆错:
![](https://img.haomeiwen.com/i19702940/d4b7a2950e7a356d.png)
提示说无法找到ncurses的包,进行安装:
第一个和第三我都yum了一下,yum源里都没有,但是第二个有,我就下载的第二个。
下载完成之后再次make menuconfig:
![](https://img.haomeiwen.com/i19702940/5bf725665efcccf0.png)
这里千万别手贱了,保持默认状态,save->ok>exit,你一定不想知道手贱的后果。
下面我们编译新内核并且安装:
刚开始编译的时候,编译速度太慢了,我就去google了一下,发现一个解决方法:将处理机内核总数调整为4。
我试了下:报错。
这里省去若干撞南墙的解决过程,直接给大家po上正确的解决方法:安装elfutils-libelf-devel。
![](https://img.haomeiwen.com/i19702940/5196ce02f5601342.png)
再次编译:make -j2
速度明显提升了好多!但是突然又报错了:
openssl/opensslv.h:没有那个文件或目录。
(经过google和上次的经验 找到了解决方法,此处也省略解决问题的过程,直接po上方法)
安装 openssl-devel:
![](https://img.haomeiwen.com/i19702940/03aa5105a6adf4b0.png)
安装完成之后再次make -j2编译:
顺畅了,不过时间还是有点长。。
最后完成编译:
![](https://img.haomeiwen.com/i19702940/b73f84a5a8d24cd3.png)
下面安装:(都是root权限)
make install modules_install
报错:
![](https://img.haomeiwen.com/i19702940/7580564ca9b79bd1.png)
这里也尝试了很多方法,最后我试了下将yum更新一下,发现就成功了?(一脸苦笑?)
不知道大家更新有没有用,这个问题我也没找到特别有用的解决方法,很抱歉,唉。
最后我们make install一下就OK了。
如果想看看自己的系统调用怎么样可以实验一下:
自己写一个c文件,在代码里添加下自己的系统调用,syscall(你之前设置的系统调用号)。
![](https://img.haomeiwen.com/i19702940/81cf54e3e52a0c92.png)
gcc编译一下,然后运行。
![](https://img.haomeiwen.com/i19702940/e6fd902ad46ce734.png)
最后使用dmesg用来显示内核环缓冲区内容,可以看到我们添加进的提系统调用函数内容。
实验真的不算复杂,也只是加深下对操作系统中系统调用的理解(其实也算不上加深了,但是debug的过程到挺让人印象深刻的),记录下这个“美好”的下午,开始新的学习把!
网友评论