lab3写的过程还是很愉快的,只能说labs是一个比一个简单
1.给未被映射的地址映射上物理页
需要补完的do_pgfault函数由页错误中断调用,提供虚拟内存管理器(struct mm_struct)和访问出错的虚拟地址作为参数。
产生页错误的其它情况的处理代码已经存在,需要补完的仅是处理所访问的虚拟地址所在页不在物理内存中的情况。
mm结构体提供了页目录表的起始地址,查找页表项的操作都需根据它进行。
若查找到的页表项为空,就说明该页还不曾被访问,因此不会在swap硬盘当中,直接为它分配一个全新的页,新建页表项,再建立虚拟地址和物理地址的映射关系即可。
2.基于fifo的页表替换算法
若查找到的页表项不为空,则说明该页已经存在于swap分区当中,分配一个新页将其换入即可。
分配新页时如果虚拟内存不足,则会调用swap_out将一个已经存在页换出。这就涉及到了需要补全的两个函数。
其中map_swappable函数将新换入的页加入待替换页的链表当中。swap_out_victim函数将最先进入队列的页换出。
3.challenge:扩展时钟算法
首先声明,我的代码加错了位置。本来应该新加一系列extended_clock_swap函数,我写的时候直接加在了fifo的代码里。
因此现在用定义在swap_fifo.h当中的宏CHALLENGE控制输出,如果该宏未定义,则正常输出;如果该宏已经定义,则输出challenge版本替换算法的测试结果。
该算法的实现其实很简单,由于mmu会自动在访问和修改页时将PTE_D和PTE_A这两个位置1,因此只需在换出的代码当中增加几次对链表的遍历,依照算法给定顺序判断换出的页即可。
PS.实践过程中,发现只要修改某个页,访问位也会自动置位,因此实际只有三种情况。
再PS.同学告诉我我对这个算法的理解出了一些问题,似乎是第一遍扫描没有结果的话,第二遍访问会修改访问位,而且换页时,会将页换入到换出页的位置,这样的话就跟我之前想的不太一样了。