Linux系统编译新内核、增加系统调用实验【Deepin版】

前言:这是操作系统学习Linux要求的必做实验之一,希望通过这种课程报告可以让大家了解Linux系统编译新内核、增加系统调用的方法,另外,现在大多数人可能会选择用ubuntu,所以对于一些用deepin版本的人编译新内核可能会有一些坑,在我下面的课程报告中也有涉及到,希望有所帮助啦~
一、实验目的
通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。
二、实验内容
1.Linux环境下的C或者C++编译和调试工具的使用
2.向Linux内核增加新的系统调用,系统调用的功能为打印出自己的学号和姓名信息。
3.Linux新内核的编译、安装和配置。
4.编写应用程序以测试新的系统调用并输出测试结果。
三、实验步骤
第一步:Linux内核编译
1.在Linux官方网站中下载最新的内核4.16版本,下载linux-4.16.tar.xz压缩包。
2.在deepin系统下,切换到root用户

#sudo  -o

3.将下载的压缩文件复制到/home目录中,分两步解压该文件

  #xz-d linux-4.16.tar.xz
  #tar-xvf linux-4.16.tar

4.清除残留的.config和.o文件【当编译出错需要重新编译或不是第一次编译时】

#make mrproper

5.配置内核

#make menuconfig

此时出现了错误如下:
解决方法:重新安装bison,flex

#apt-get install bison
#apt-get install flex

重新执行#make menuconfig,选择save并退出
6.编译内核,生成启动映像文件【CPU是4G,则需要+2】

#make -j6 bzIamge

第一次编译时会出现OpenSSL错误,只需安装OpenSSL并重新执行make命令。

   #apt-get install libssl_dev

7.编译模块

#make modules

自己用了大约两个多小时。
Linux系统编译新内核、增加系统调用实验【Deepin版】_第1张图片
8.安装内核

#make modules_install
#make install

Linux系统编译新内核、增加系统调用实验【Deepin版】_第2张图片
Linux系统编译新内核、增加系统调用实验【Deepin版】_第3张图片
9.配置grub引导程序并执行reboot重启系统,最后查看内核最新版本

#update-grub2
#reboot
#uname -a

Linux系统编译新内核、增加系统调用实验【Deepin版】_第4张图片
第二步:修改源程序,增加系统调用
1.分配系统调用号,修改系统调用表
查看系统调用表(./arch/x86/entry/syscalls/syscall_64.tbl),选择新添加的系统调用号为334号。
Linux系统编译新内核、增加系统调用实验【Deepin版】_第5张图片
2.申明系统调用服务例程原型(./include/linux/syscalls.h),在末尾添加
3.实现系统调用服务,添加一个系统调用,实现对指定进程的 nice 值的修改或读取功能, 并返回进程最新的 nice 值及优先级 prio。按照第一步中的内容重新编译内核
4.编写用户态程序测试新系统调用,新建一个空白文档,并重新命名为test1.c,写入以下函数。nice 值参数表示的是与执行指令的优先权等级,等级范围为 -20 ~ 19。数值越小,等级越高。在测试程序中先后设置了 nice 值为 -5 和 -15 的情况,观察当前进程调度块的 nice 值和 prio 值的变化。
Linux系统编译新内核、增加系统调用实验【Deepin版】_第6张图片
5.测试 用gcc命令编译测试文件

    # gcc -o test test.c
    #./test

Linux系统编译新内核、增加系统调用实验【Deepin版】_第7张图片

  #dmesg

(将信息打印在日志文件)
Linux系统编译新内核、增加系统调用实验【Deepin版】_第8张图片
四、实验体会
在实验开始之前,首先要安装Linux系统,在衡量了Ubuntu和deepin这两种版本,在系统的美观程度上选择了deepin,但是这也在后期带来了麻烦。由于书本上的教程和网络上大部分的教程与针对Linux系统出现的问题的解决方案都是基于Ubuntu系统的,当我在做实验一时遇到的问题,通常在网络上找不到具体详细的解答,这也为我带来了一定的挑战。
1.在Linux内核编译时,执行到配置内核的步骤时,运行命令#make menuconfig后会一直出现【问题】,书本上并没有这种问题出现,我也将这个问题在百度谷歌上搜索了许久,由于使用deepin版本的资源还占少数,Ubuntu版本并没有这个问题出现,许久之后还是没有找到这个问题的解决方法。在囫囵吞枣阅读了许多的文档和其他错误的解决方案之后,我也仍然对这个问题一头雾水,不知道该如何解决,无从下手。后来在一筹莫展之际,我跟自己说是不是我把问题想得太简单了呢?既然它提示找不到bison,那我就自己安装一个好了,但是如果安装错了会不会把系统弄坏了呢,在一番思想挣扎之后,我还是决定就按照自己的思路走吧,即使系统崩了就重装好了。于是我按照安装ncurses套件的方式执行了#apt-get install bison命令,在安装完成之后又提示了关于flex的错误,于是按照同样的道理我也重新安装了flex,最终终于可以顺利打开配置对话框。
2.在实验一的过程中我一共安装了三次内核,因此在内核模块化这一部分浪费了许多时间。在要执行需要时间比较长的编译时,应该选择适合的时间段去进行。正如我第一次编译内核时选择了晚上九点多开始,在10点多才开始编译模块化。模块化的过程需要大概两个半小时,而宿舍11点就熄灯了,这个时候,需要担心电脑是否能支撑模块化结束,我可能也要等待到凌晨1.2点钟。另外,第三次编译内核是因为最开始时只注意到了标题,和直接就按照书上的流程去执行,忽略了实验要求的具体要求。它需要对指定的进程nice值得修改或读取功能,并返回进程最新的nice值和优先级prio。
3.在执行测试程序时运行# gcc -o test test.c提示找不到这个文件。查阅了这个问题之后发现是可能gcc和g++不兼容的问题。于是我重新安装了gcc。
Linux系统编译新内核、增加系统调用实验【Deepin版】_第9张图片
Linux系统编译新内核、增加系统调用实验【Deepin版】_第10张图片
4.在编写测试程序中也更要注意程序的编写。在第一次执行测试程序时报错。在检查过后发现自己是在函数调用参数中多打了一个逗号,这也提醒了我在以后的编程要更加注意,需要细心仔细。
希望对你们有帮助嘻嘻~~~~~

你可能感兴趣的:(Linux)