一、实验目的
学习如何产生一个系统调用,以及怎样同过往内核中增加一个新函数,从
而在内核空间中实现对用户空间的读/写。
二、实验内容
(一)部分A
添加一个新的内核系统调用,具体完成某个你希望实现的功能。
(二)部分B
重新编译内核,使你的系统调用可用。
(三)部分C
编写一个用户态的程序,验证你增加的系统调用。
三、实验步骤
(一)部分A:添加新的内核系统调用
1.开启超级管理员权限
2.进入新内核目录
3.编辑系统调用入口表
4.这里第一段系统调用号在451结束,所以我们增加的系统调用号为452,以后我们使用系统调用时需要使用452这个号码来调用。每个人的号都有可能不同,我的系统调用名为mysyscall,可以自己任意取,sys_mysyscall是接下来要添加了函数名称(以sys_开头),添加完后,点击右上方的保存,然后退出。
5.添加系统调用函数声明
6.翻到后边添加一个函数声明【注意此时的函数名 sys_mysyscall() 应与上一步在系统调用表中的添加的一致,同上保存然后退出】
7.添加系统调用的函数定义
8.使用内核函数printk()打印姓名缩写和学号,然后返回0。保存并退出。
注意:此处的打印并不是打印在终端命令行中,而是日志文件
至此完成添加新的内核系统调用。
(二)部分B:重新编译内核
注意:此处一定要拍摄虚拟机快照,方便编译内核失败时恢复到现在的状态!!
1.将源代码净化
2.查看旧内核的配置文件名
3.将此文件拷贝
4.对内核选项进行配置
5.按图配置
6.删除配置时留下的一些不用的文件
7.编译内核
8.出现报错
9.为解决错误,编辑.config文件
10.修改CONFIG_SYSTEM_TRUSTED_KEYS,将其赋空值,保存并退出
修改前
修改后
11.重新编译,遇到类似错误,将CONFIG_SYSTEM_REVOCATION_KEYS赋空值
修改前
修改后
11.再次重新编译,编译成功
12.编译内核模块
13.编译成功
14.安装内核模块
15.安装成功
16.安装拷贝镜像文件
17.安装完成,重启虚拟机
18.运行编译完成的内核
本部分完成。
(三)部分C:编写程序,验证增加的系统调用
1.编写测试C语言程序
2.编译
3.运行
返回了return 0 ,说明程序执行成功
4.查看日志文件
5.成功看到了打印信息
至此,本部分结束。
四、实验过程记录
(一)存在问题
1.内核错误
报错方式:No rule to make target ‘debian/canonical-certs.pem’, needed by ‘certs/x509_certificate_list’
解决方案:编辑.config文件,修改CONFIG_SYSTEM_TRUSTED_KEYS以及CONFIG_SYSTEM_REVOCATION_KEYS,将他们赋空值。
2.编译错误
存在问题:将printk打成了prink
解决方案:修改代码,重新编译。
(二)注意事项
1.多用快照功能
由于内核是系统最核心的部分,稍有操作不慎就会崩盘,要使用VMware的系统快照功能在每个关键节点处进行存档,如有问题及时回档拯救;
2.边做实验遍记录
完整地记录下实验流程,便于完成后复盘整理,提升自我能力;
3.注意细节
不要遗漏步骤,严格按照流程完成,避免出错。
五、参考文献
https://blog.youkuaiyun.com/hhb442/article/details/106513084
https://blog.youkuaiyun.com/zxncxy/article/details/115190538
https://blog.youkuaiyun.com/qq_36393978/article/details/118157426