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

操作系统原理这门课布置了一项作业,要求在Ubuntu系统添加新的系统调用(本人用的虚拟机) 准备工作 获取linux内核源代码 可以在官方网站https:www.k

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

准备工作

获取linux内核源代码

可以在官方网站https://www.kernel/上下载linux内核源代码的压缩包

本人自己下载的是stable:5.0.13
下载内核压缩包之后,从自己电脑系统直接鼠标拖进虚拟机的ubantu的主目录下

下载压缩包之后,先解压缩,然后通过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/Aliceatsea/article/details/88360264
重启成功后就可以验证了

验证添加的系统调用

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

sudo gedit test.c

创建一个文本文档,写一个调用系统函数的程序,保存退出

然后依次输入命令:

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

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

如图所示:


这样就成功了!!!!!

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

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754974436a5223446.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信