Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

时间:2024-04-06 16:45:14
这个作业我是从五月上旬开始着手准备的,因为在这期间有几门考试,所以从装系统到完成作业前前后后大概用了半个多月的时间。在做作业的过程中,我经历了很多之前没有经理过的东西,装双系统,修改内核,为Ubantu升级网卡驱动,之后又因为Ubantu系统故障导致重装系统,最后为了保险起见转而使用虚拟机,这其中的酸甜苦辣真是一言难尽。虽然在做作业的时候解决了很多与添加系统调用无关的棘手事情,但我实实在在的通过解决这些问题学习得到了很多东西,增强了我解决实际问题的能力。好了,话不多说,下面我就来介绍一下具体实验过程。

首先,是装Linux系统,你可以装双系统或者是在Windows上装虚拟机。但是作为初学者,我个人建议还是直接装虚拟机,简单方便,又不容易出现问题,降低了很多风险。我之前就是装的双系统,但是因为操作失误导致再也无法进入Linux了,无奈只好将Linux卸掉,但是卸载Linux有存在着之后无法进入Windows的风险,那样的话最后只好去刷机了。现在网上有许多不同版本的Linux操作系统,例如Ubantu,LinuxMint,Debian和Red Hat,但是最常用的还是Ubantu,我用的是Ubantu16.04。这里我分享一个安装虚拟机的教程链接,包括虚拟机的下载和Ubantu镜像的下载网址和方法https://blog.csdn.net/naomiedna/article/details/51752788。另外再给有兴趣安装双系统的同学一个教程链接这里面用的是Uabntu14.04,安装过程应该大同小异,不同担心:http://m.xuexila.com/diannao/xitong/linux/399492.html。但是要强调的一点是,在装系统的过程中一定要联网,最好插网线,以免给之后连不上网,还要更新什么驱动之类的特别麻烦。我就是因为没有接网线,最后没有网,光一个以太网,我就搞了3天才连上。

其实添加系统调用就是对操作系统的内核进行更改,然后编译内核重新生成操作系统,安装之后重启电脑,进入你重新生成的系统,然后测试就OK了。虽然说的比较简单,但是对于初学者很多东西都需要自己摸索,而且在离开了windows熟悉的操作环境下,利用命令行完成对系统调用的添加,还是有一定的难度的。首先既然要编译内核,那么就要有一个可供编译的内核,我用的内核版本是4.16.8,这里给个官网下载地址https://www.kernel.org/,内核是不断更新的,当你看到这篇文章的时候可能已经是新的版本了。下载之后要将文件解压到当前,Ubantu里叫提取文件,之后将文件移动到/usr/src目录下,但你会发现用鼠标无法移动它,系统会提示提示你权限不够。因为linux操作系统大概分为内核态和用户态,当你从用户态变成内核态之后,你能做更多的事,比如访问一些特殊位置,执行一些特殊命令,这时候就要用到Linux的终端命令了,具体切换命令可见https://blog.csdn.net/frank_jb/article/details/50927088,密码就是你在安装时候设置的开机密码。下面,在键盘输入Ctrl+Alt+T打开终端,在命令行中输入“cd 文件当前位置”,定位到内核当前所在文件夹,然后输入sudo mv linux-4.16.8 /usr/src 将文件移动到该文件夹下。下图是我操作时的界面截图。

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

下面,就要开始修改内核代码了,源码目录下涉及内核修改的有三个文件。

1、先打开第一个 /arch/x86/entry/syscalls/syscall_64.tbl//设置系统调用号,如果是32位就用syscall_32.tbl。点开之后在里面添加自己的系统调用号,如333行所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

2、打开第二个 /include/linux/syscalls.h//系统调用的头文件。在这里添加函数声名:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

3、打开第三个/kernel/sys.c //定义系统调用。找一块地方添加想要实现函数的功能:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

好的,修改完内核源码之后就要开始编译内核了,进入到了最为关键的一部分。编译内核分为四步。首先要进入你的linux内核文件,cd /usr/src/linux-4.16.8。

1、sudo make menuconfig

一开始系统提示我缺少ncurses驱动,经过查找资料,找到了下面的解决方法

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

在终端下输入sudo apt-getinstall libncurses5-dev libssl-dev,系统便会下载相关驱动并解析安装,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

当再次输入sudo makemenuconfig时,系统又提示缺少bison驱动。如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

有了上一步的经验,那么我们输入sudoapt-get install bison,系统会下载和安装驱动,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

当再一次输入sudo makemenuconfig时,系统又提示缺少flex驱动,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

那么我们输入sudo apt-getinstall flex,系统会下载和安装驱动,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

当再一次输入sudo makemenuconfig时,终于进入了menuconfig界面,然后直接选择Save,完了之后Exit就可以了,完成会产生一系列文件,最关键的文件叫做 ".config",这个就是告诉内核哪些地方会编译,那些不需要,按步骤来就行,这个图我忘截了,盗了一张,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

2、sudo make

这个时候系统会提示我下载 libelf-dev,libelf-devel or elfutils-libelf-devel,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

输入命令代码sudo apt-getinstall libelf-dev,系统自动修复,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

之后再输入sudo make,就开始了漫长的编译过程,这是后需要有耐心。我大该从晚上十点左右一直等到了第天凌晨快一点,但是还是没有编译完。实在太困了,我就睡觉去了。大概4:40的时候我起来看了一下,已经编译完了,电脑先休眠,早上再弄。

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

3、sudo makemodules_install

这一步就是安装一些驱动和功能,过程挺快。

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

4、sudo make install

这一步是把内核安装到系统中。如果你看到了下图的结果,那么恭喜你,大功快要告成了!

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

下面我们要做的就是重启电脑(虚拟机)进行测试了。进入的时候会出现GUN GRUB界面,我们选择Ubantu高级选项,然后Enter进去

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

然后选择第一项,Enter进去,如下图所示:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

这时候你会得到下面的界面,这是系统在初始化并且自检:

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

现在就是测试阶段,你可以安装一个vim编辑器sudo apt-get install vim-gtk,再在你的主目录下面创立一个.C文件,用作测试代码,具体方法可见https://blog.csdn.net/yuechuxuan/article/details/69989320。在终端中输入命令vim hello.c打开你刚刚创建的 .C文件,输入下面的测试代码。

 Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

然后利用gcc编译器编译,如果你的系统里没有的话,在终端中输入sudo apt-get  build-depgcc命令,进行安装下载。然后输入gcc hello.c编译上面的 .C文件,再输入./a.out输出编译结果。如果结果是1,那么证明你成功了,否则,再试试吧。

最后,在终端中输入命令dmesg,查看系统日志,你会惊喜的发现,在最后出现了“Hello,world!”,这就表明我们的操作最终成功了!

Ubantu16.04添加系统调用(内核版本4.16.8)作业报告

最后发表点感想。首先从这次作业中我掌握了包括装双系统,装虚拟机,修改内核,更改Linux网卡驱动等等一系列之前没有接触过的技能,同样,通过这次作业,我也更加深入的了解到了Linux操作系统的工作机理,也激发了我对于《操作系统原理》这门课程的兴趣,也更加希望接受下一次新的挑战,不断学习提升自己。同样,很感谢老师给了这样一个题目,实实在在的让我们得到了锻炼,通过自己动手解决问题的过程很爽,很期待新的挑战。