重新编译Linux内核踩的坑

本文详述了一次重新编译Linux内核以添加一个统计缺页和脏页数的系统调用的实验过程。实验包括在内核中添加系统调用号、更新系统调用表、编写用户态测试程序等步骤,并讨论了实验中遇到的问题和解决方案,以及对修改系统调用安全性的问题进行了思考。
摘要由CSDN通过智能技术生成

比较有意义的一次实验,坑都写在讨论与心得里。

实验目的

学习重建Linux内核。

学习Linux内核的系统调用,理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。阅读Linux内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程。了解Linux操作系统缺页处理,进一步掌握task_struct结构的作用。

实验内容

在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现统计操作系统缺页总次数、当前进程的缺页次数及每个进程的"脏"页面数,严格来说这里讲的"缺页次数"实际上是页错误次数,即调用do_page_fault函数的次数。实验主要内容:

  • 在linux操作系统环境下重建内核
  • 添加系统调用的名字
  • 利用标准C库进行包装
  • 添加系统调用号
  • 在系统调用表中添加相应表项
  • 修改统计缺页次数相关的内核结构和函数
  • sys_mysyscall的实现
  • 编写用户态测试程序

实验指导

完成实验后回答问题:

  1. 多次运行test程序,每次运行test后记录下系统缺页次数和当前进程缺页次数,给出这些数据。test程序打印的缺页次数是否就是操作系统原理上的缺页次数?有什么区别?
  2. 除了通过修改内核来添加一个系统调用外,还有其他的添加或修改一个系统调用的方法吗?如果有,请论述。
  3. 对于一个操作系统而言,你认为修改系统调用的方法安全吗?请发表你的观点。

 

 

 

 

实验报告

 

一、实验环境

 

二、实验内容和结果及分析

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值