编译内核及系统调用实验

天大地大妈咪最大 提交于 2020-03-31 14:15:25

 电脑出现各种问题,在装虚拟机时也出现了各种问题,给的实验指导书也有各种问题。周四折腾一下午+晚上、周五一天、周六一天,遇到的各种问题都搞定了,实验成功了,现在贴出我的操作步骤,感觉这将会是我的最干的博客之一。

先贴出结果吧

 

准备工作:

我的电脑只有120G,之前一直做了个Ubuntu的启动盘用,这次没预料到实验对硬盘空间需求如此之大,只得重装虚拟机。在移动硬盘上开辟空间50G(建议不要装好系统后再扩展容量,时间耗费巨大而且ubuntu自带软件中没有硬盘分区软件,安装硬盘分区软件还需要很多依赖,烦不胜烦),在VMware Workstation上使用高级模式创建虚拟机,CPU和内存配置为2x2,4G。在创建完成ubuntu虚拟机后不要立即运行!!!因为VMtools在创建好了以后会自动加载到你刚指定的虚拟机文件夹中,在开启ubuntu虚拟机后它会和系统引导一起启动,导致系统卡死在“install vm-tools"这一行,解决的方法就是在虚拟机文件夹中找到autoinst.iso这个文件并删除(这会导致系统不能自动安装并且在装好系统后不能使用vmtools这个工具,如果想使用vmtools这个工具只能在系统安装完成后再安装,后面讲)。删除上述文件后可以启动系统安装了,,,,,,,,,,,,,安装完成后选择

 

设置中选择VM Workstation安装文件夹,在其中选择”linux.iso"这个文件,设置完毕后别忘了执行连接。这时ubuntu桌面上会显示一个名为vmtools的镜像驱动方式,打开进入后拷贝其中的压缩包放置在桌面上,tar -xvf xxx解压后进入文件夹,开启终端,sudo su提权,键入 ./vmware-install.pl 命令,安装vmtools。等待安装结束后键入命令 reboot 重启虚拟机。在重启完毕后,进入系统设置,在显示一栏中可以调整屏幕显示大小和分辨率。至此vmtools安装结束。

 

 

实验操作:

 

 

step1.下载内核

  首先我再www.kernel.org下载内核包,版本是4.14.0,我本机使用的Ubuntu版本是4.13.xxx后面我忘了。终端执行sudo su提权,将压缩包复制到/usr/src/文件下,tar -xvf linux-4.14解压缩。

 

 

step2.进入刚才解压好的文件夹中(下面讲述时默认的起始路径都是此文件夹),使用任意文本编辑器编辑kernel目录下的sys.c文件,在文件最后编写自己的函数:

修改系统头文件路径为:/include/linux/syscalls.h,在文件最后的#endif之前添加函数声明

 

 修改系统调用号:此处实验参考有问题,路径错误,正确的路径是:

进入后目录中有个syscall_32.tbl/syscall_64.tbl两个文件,如果是32位系统就修改前者,否则后者,我是64位系统,修改后者:

修改格式为上个数字+1,64,zyq,sys_zyq,如下图所示

 

 

 step3.编译部分

  友情提示:在每执行一步最好都要做一个快照,以备后期出错恢复。

  准备工作,裸机ubuntu没有make、gcc等命令和包需要安装下。命令格式以make命令为例子:apt install make

        还需要的包    apt install libssl-dev  apt install build-essential

  终端键入命令 make mrproper  用以清除内核的目标文件、附属文件以及配置文件(一般第一次编译时候需要使用,主要防止下载的源码包有一些配置文件,影响结果)

  make clean 清除内核中的目标文件,并不会删除设置文件(在后续需要重新编译时候,只需要make clean就可以了)

  make bzImage (sudo make bzImage –j4代表用四线程去运行,速度相对较快吧)  编译内核:时间大概半个小时

  make modules (sudo make modules –j4) 编译模块,这个花费的时间是最长的约为2~4h

  make modules_install 安装刚编译好的模块

  make install –j4 安装内核

 

step4.修改grub引导

 一般来说虚拟机中grub引导菜单会被隐藏,即使更新内核后你也无法选择进入哪个内核,此时可以修改grub参数。修改文件sudo gedit /etc/default/grub,我的做法是把GRUB_HIDDEN_TIMEOUT注释,直接显示菜单。

 

影响grub关键三个因素:

GRUB_HIDDEN_TIMEOUT:执行该行的意思为默认启动过程不显示grub,但会有空白界面的延迟,延迟时间就是它的值,空白界面相当于提示我们你可以手动选择进入grub菜单,按shift键强制进入grub菜单界面

将GRUB_HIDDEN_TIMEOUT用#注释掉,它表示菜单直接显示。

GRUB_HIDDEN_TIMEOUT_QUIET: true表示不显示空白界面延迟时间,false表示显示。

GRUB_TIMEOUT:当GRUB_HIDDEN_TIMEOUT被注释后,表示如果grub界面后停滞的时间。

修改完毕后终端键入命令 update-grub 更新下刚才修改的grub,完毕后重启虚拟机。

 

step5.验证

  新建文件test.c键入代码:

 

gcc编译后执行程序,并且使用 unmae -r命令查看内核版本

 

说明修改成功

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!