比较有意义的一次实验,坑都写在讨论与心得里。
实验目的
学习重建Linux内核。
学习Linux内核的系统调用,理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。阅读Linux内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程。了解Linux操作系统缺页处理,进一步掌握task_struct结构的作用。
实验内容
在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现统计操作系统缺页总次数、当前进程的缺页次数及每个进程的"脏"页面数,严格来说这里讲的"缺页次数"实际上是页错误次数,即调用do_page_fault函数的次数。实验主要内容:
- 在linux操作系统环境下重建内核
- 添加系统调用的名字
- 利用标准C库进行包装
- 添加系统调用号
- 在系统调用表中添加相应表项
- 修改统计缺页次数相关的内核结构和函数
- sys_mysyscall的实现
- 编写用户态测试程序
实验指导
完成实验后回答问题:
-
多次运行test程序,每次运行test后记录下系统缺页次数和当前进程缺页次数,给出这些数据。test程序打印的缺页次数是否就是操作系统原理上的缺页次数?有什么区别?
-
除了通过修改内核来添加一个系统调用外,还有其他的添加或修改一个系统调用的方法吗?如果有,请论述。
-
对于一个操作系统而言,你认为修改系统调用的方法安全吗?请发表你的观点。
实验报告
一、实验环境
二、实验内容和结果及分析
1、实验设计思路
本实验的前半部分按照老师的实验指导来就可以了,只要不发生误操作,就没有什么太大的问题。因此,这里主要对统计程序的设计思路做详细说明:
在实验指导中给出了pf和pfcount,所以实现缺页次数并不难,直接打印即可。那么怎么去统计脏页数呢?经过查阅资料发现task_struct中有一个数据成员叫做nr_dirtied,遍历所有进程,循环打印这个数据成员即可。
2、实验步骤及截图
3、测试程序运行结果截图
首先我们可以查看当前的内核版本:
再对比之前的内核版本:
说明成功吧4.10.0的内核换成了4.8.0。
然后去var/log/kern.log中查看程序输出结果:
可以看见,总的缺页次数是489725,当前进程的缺页次数是72,脏页数的部分截图如上(比较多,这里只截取了一部分)。
4、结果分析
5、源程序
首先是统计总的缺页次数、当前进程缺页次数以及各个进程脏页数的程序,这个程序比较特别的地方是要用task_struct中的nr_dirtied,如下所示:
/***********************************
*Project Name:实验2统计程序
*Author:
*Student ID:
*Last Modified: 2017/12.23