操作系统作业:Ubuntu编译一个新内核以及添加系统调用

操作系统原理这门课布置了一项作业,要求在Ubuntu系统添加新的系统调用(本人用的虚拟机)

准备工作

获取linux内核源代码

可以在官方网站https://www.kernel.org/上下载linux内核源代码的压缩包
在这里插入图片描述
本人自己下载的是stable:5.0.13
下载压缩包之后,先解压缩,然后通过mv指令将压缩后的文件夹转移到/usr/src目录下,或者先把压缩包转移到/usr/src目录,/usr/src不能够直接找到
解压:tar -xvf linux-5.0.13.tar.xz
mv指令后面第一个参数填写自己的路径,第二个指令填写要转移到的路径

sudo mv (需要转移的文件夹的位置)/usr/src/

例如:sudo mv linux-5.0.13 /usr/src/
!!!注意在linux-5.0.13 (第一个路径)后加一个空格

安装相关依赖

安装相关依赖直接在终端进行。先打开终端(快捷键Ctrl Alt T),依次输入如下命令:

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

注意,这里一定要安装完所有相关的依赖,否则下面在编译内核的时候会出错。如果编译更新版的内核,可能会要求有更多的依赖性,根据编译时候的报错原因,继续安装相关的依赖就可以,安装完成之后再重新编译内核。

添加自定义的系统调用

进入目录下

cd /usr/src/linux-5.0.13                               //进入linux-5.0.13目录下

输入ls能显示目录下面的文件

打开添加自定义的系统调用号的文件

sudo gedit arch/x86/entry/syscalls/syscall_64.tbl

在这里插入图片描述

如图所示,335,336是我自己添加的系统调用的调用号

在这里插入图片描述
输入命令:

sudo gedit include/linux/syscalls.h

在打开的文件的末尾添加函数声明,如图所示
在这里插入图片描述
输入命令:

sudo gedit kernel/sys.c

在打开的文件末尾添加函数的定义,如图所示
在这里插入图片描述

编译内核

配置

依次输入以下命令:

sudo make mrproper
sudo make clean
sudo make menuconfig

其中
sudo make mrproper可以清除编译过程中产生的所有中间文件
sudo make clean可以清除上一次产生的编译中间文件
sudo make menuconfig指令输入后会出现选择的图形化界面,如下图所示
在这里插入图片描述
选择Save保存配置信息,然后选择Exit退出

但是如果终端窗口不够大可能会报错,如图所示
在这里插入图片描述

编译

输入命令:sudo make -j2 //编译内核
编译花的时间较长
如果电脑是四核的,就用了-j4,如果电脑是八核的,也可以用-j8。j后面的数字越大,编译的时间就越快。

生成新内核

编译完成之后,就可以生成新内核
首先,我们要先安装内核,依次输入如下命令:

sudo make modules_install         //安装内核模块
sudo make install        //安装内核

安装完成之后,在最后可以看得到新内核版本号,拍照!!!
等安装完内核之后,就重新启动计算机
输入指令:reboot //重启计算机
重启过程中一直按Shift键(也有可能是Esc键),进入Ubuntu高级选项界面,即可见到编译好的内核,选择该内核启动,如图所示
选择第二个Ubuntu 高级选项
在这里插入图片描述
然后选择新安装的内核,前面已经拍照

若出现下面情况一般是分配内存不够,需要扩充内存

在这里插入图片描述

在这里插入图片描述
若出现这种情况,如下图
在这里插入图片描述
请参考:https://blog.csdn.net/Aliceatsea/article/details/88360264
重启成功后就可以验证了

验证添加的系统调用

编写一个C语言程序验证添加的系统调用
输入命令:

sudo gedit test.c

创建一个文本文档,写一个调用系统函数的程序,保存退出
在这里插入图片描述
然后依次输入命令:

sudo gcc -o test test.c
sudo ./test

运行该程序
再输入命令:sudo dmesg
查看系统进程,可以看到系统调用的输出

如图所示:
在这里插入图片描述
**加粗样式**
这样就成功了!!!!!

参考文章:
https://blog.csdn.net/qq_42606750/article/details/88614358
https://blog.csdn.net/qq_42606750/article/details/88621141

猜你喜欢

转载自blog.csdn.net/weixin_44224230/article/details/89945899