实 验 名 称 | 虚拟内存管理 |
- 实验目的
(1)理解操作系统中缺页中断的工作原理。
(2)学会通过修改内核实现统计系统缺页次数的方法
- 实验内容
通过修改 Linux内核中的相关代码,统计系统缺页次数。
- 实验步骤
(1)在内核源代码中找到include/linux/mmh文件,声明变量pfcount用于统计缺页次
数,如图9.1所示。
同样,在/arch/x86/mm/fault.c文件中定义变量 pfcount,如图 9.2 所示,并在
o_page_fault0函数中找到并修改 good area,以使变量 pfcount 递增 1,如图9.3 所示。
(3)修改 kermel/kallsymsc 文件,即在这个文件的最后插人“EXPORT_SYMBOL
(pfcount);”该步的作用是使得在EXPORT_SYMBOL标签内定义的函数或变量对全部内
核代码公开。既可以使用文本编辑器修改这个文件,如图9.4 所示,也可以使用命令 echo
EXPORTSYMBOL(pfcount);'>>kernel/kallsyms.c来完成修改。
(4)重新编译内核
(5)编写测试程序readpfcount.c。测试程序的功能是以内核模块的形式读取pfcount的
值并输出。参考代码如下:
编写相应的Makefile文件,参考代码如下:
(6)编译并加载内核。
- 实验结果
内核加载成功后,输入如下命令,测试实验结果,如图所示。
五、实验总结
1.说明本实验中统计缺页次数的原理,并阐述其合理性
(1)缺页中断的原理
在操作系统中,虚拟内存是一种抽象概念,它允许程序使用比物理内存更大的地址空间。当程序访问虚拟内存中的某个页面时,如果该页面当前未加载到物理内存中,就会发生缺页中断。
缺页中断是一种由处理器触发的异常,它指示操作系统需要将所需页面从磁盘加载到物理内存中。缺页中断的工作原理如下:
当程序访问某个虚拟地址时,处理器会检查该地址对应的页面是否已加载到物理内存中。
如果页面已在物理内存中,则处理器正常执行读取或写入操作。
如果页面未加载到物理内存中,则处理器触发缺页中断,并将控制权交给操作系统内核。
操作系统内核根据缺页中断的信息,确定需要加载哪个页面。
内核查找页面所在的磁盘位置,并将页面读取到物理内存中的空闲页面中。
内核更新页面表和相关数据结构,以反映页面已经加载到物理内存中。
处理器恢复执行被中断的指令,重新访问虚拟内存中的页面。
(2)统计系统缺页次数的方法
要统计系统的缺页次数,可以通过修改 Linux 内核的相关代码来实现。具体方法如下:
在内核中找到处理缺页中断的代码段。
在缺页中断处理代码中增加一个计数器,用于记录缺页次数。
在每次发生缺页中断时,将计数器递增。
可以将缺页次数记录在内核的数据结构中,或者通过特定的系统调用将缺页次数返回给用户空间。
(3)统计缺页次数的原理及其合理性
统计缺页次数的原理是在缺页中断处理代码中添加计数器,并在每次缺页中断发生时进行递增。这样做的合理性在于:
缺页次数是评估系统内存管理性能的重要指标。通过统计缺页次数,我们可以了解系统中缺页的频率,进而评估内存分配策略和调度算法的效果。
缺页次数可以用于诊断系统性能问题。如果系统的缺页次数过高,可能表示内存不足或者页面置换算法不合理,从而影响系统的性能和响应时间。
统计缺页次数可以帮助系统管理员或开发人员确定系统的瓶颈所在,进而优化系统的内存管理策略,提高系统的性能和可靠性。
2.实验过程中出现的问题及对应的解决方法
问题1:makefile文件编写错误导致无法编译成功
解决方法:查看报错信息,根据错误提示进行修正。
问题2:fault.c文件编写错误导致无法编译成功
解决方法:查看报错信息,根据错误提示进行修正,发现是把()错误的写成了大括号,再返回fault.c文件修改,重新编译。
问题3:最后一步的make以及insmod readpfcout.ko运行报错
解决方法:检查发现 make指令以及insmod readpfcout.ko指令应该在makefile 、readpfcount.c文件所在的目录下运行,并且是特权模式下才可以正常运行。
3.总结体会
本次实验围绕Linux的虚拟内存展开,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉。
虚拟内存主要有如下三个功能:
①把主存看作为一个存储在硬盘上的虚拟地址空间的高速缓存,并且只在主存中缓存活动区域(按需缓存)。
②为每个进程提供了一个一致的地址空间,从而降低了程序员对内存管理的复杂性。
③还保护了每个进程的地址空间不会被其他进程破坏。
CPU中含有一个被称为内存管理单元(Memory Management Unit, MMU)的硬件,它的功能是将虚拟地址转换为物理地址。MMU需要借助存放在内存中的页表来动态翻译虚拟地址,该页表由操作系统管理。
当CPU遇见缺页时会触发一个缺页异常,缺页异常将控制权转向操作系统内核,然后调用内核中的缺页异常处理程序,该程序会选择一个牺牲页,如果牺牲页已被修改过,内核会先将它复制回硬盘(采用写回机制而不是直写也是为了尽量减少对硬盘的访问次数),然后再把该虚拟页覆盖到牺牲页的位置。
当缺页异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把导致缺页的虚拟地址重新发送给MMU。由于现在已经成功处理了缺页异常,所以最终结果是页命中,并得到物理地址。
这种在硬盘和内存之间传送页的行为称为页面调度:页从硬盘换入内存和从内存换出到硬盘。当缺页异常发生时,才将页面换入到内存的策略称为按需页面调度,所有现代操作系统基本都使用的是按需页面调度的策略。
通过本次实验,我不仅加深了对操作系统内存管理的理解,还提升了对内核代码修改和编译的能力。还让我体验到了操作系统内存管理的实际操作和应用,并对评估和优化系统性能有了更深入的认识。我对Linux的虚拟内存有了进一步掌握,熟悉了其工作原理。对缺页异常的产生有了一定了解,掌握了统计缺页异常的方法。