一 题目介绍
本实验通过修改Linux内核源码,添加新的Linux系统调用,替换编译后内 核,并测试结果,了解Linux内核源码的编译方法和内核的安装方法,系统调用 的概念、编写步骤和调用方法。
任务描述:
- 掌握 Linux 系统调用基本概念
- Linux 内核源码的编译和安装
- 添加 Linux 的系统调用
- Linux 的系统调用的测试方法
实验目的:
- 学习掌握 Linux 内核的编译和启用
- 学习掌握如何添加 Linux 的系统调用
- 学习掌握测试 Linux 系统调用
二 实验思路
图1:编译内核流程图
图2:添加系统调用流程图
三 遇到问题及解决方法
- 在添加系统调用时,要输入很多代码,但是又没有编译器的报错机制,所以输错了一个字母导致出错还很难发现错误出现在哪里,所以进行这个实验的时候最好分开实验,并且要仔细检查代码是否出错。
- 看到选做题目后没有相关思路,去查看了相关资料,了解了相关的API之后问题就迎刃而解了。
四 核心代码及实验结果展示
图1:查看当前内核版本号
图2:通过安装lrzsz后使用rz命令上传下载好的kernel
图3:对解压之后的kernel进行编译
图4:编译完成
图5:通过VNC方式登录进行重启操作
图6:重启后看到可以选择自己编译出来新的内核
图7:进入系统后查看版本号已经更新
图8:在系统调用表中加入自己的syscall函数并赋予它系统调用号
图9:声明自己的系统调用服务例程原型
图10:编写自己的系统调用服务例程
图11:重新编译内核之后在编写一个用户态程序来调用自己的syscall
图12:自己的syscall已经完成运行,打印了我们想要的结果
图13:在系统调用表中加入自己的syscall函数并赋予它系统调用号
图14:声明自己的系统调用服务例程原型
图15:编写自己的系统调用服务例程
图16:重新编译内核之后在编写一个用户态程序来调用自己的syscall
通过usemode选择是查询指定pid的nice值还是修改nice值
图17:首先输入top指令查看pid为1的进程的nice值为10,prio值为30
运行编译好的文件之后输出与top查询到的信息相同
图18:输入usemode为1,输入指定pid和input_nice的值进行修改
程序运行完后再输入top指令可以看到pid为1的进程的nice和prio已经被修改了
图19:如输入的pid为无效值则如上输出
图20:输入hostnamectl指令查看,没修改主机名之前只有一个静态主机名
图21:在系统调用表中加入自己的syscall函数并赋予它系统调用号
图22:声明自己的系统调用服务例程原型
图23:编写自己的系统调用服务例程
图24:重新编译内核后编写用户态程序调用该系统调用并输入要修改的主机名
图25:再次使用hostnamectl指令可以看到此时多了一个临时主机名