SWAP挑战性任务实现报告

任务内容

任务使用swap_disk挂载至MOS作为swap时存储磁盘。

PIIX4的介绍:MOS基于Malta开发板,而其所使用板载的PIIX4芯片组支持IDE等设备并有两个独立的IDE通道。
一个IDE通道连一个IDE控制器,一个控制器连两个IDE设备,则MOSPIIX4支持4块IDE设备。
两个IDE控制器偏移地址为:1.主控制器块偏移:0x1F0;2.从控制器块偏移:0x170(这些都基于PIIX4PCIIO基地址0x18000000,即实验中定义的MALTA_PCIIO_BASE)
具体读写操作参考原有实现
为避免与文件系统使用的主IDE控制器冲突,可在内核态使用从IDE控制器读写磁盘,用于存储交换页面
可修改Makefile文件中定义的QEMU_FLAGS变量来挂载多块磁盘。即多加一条:$(shell [ -f '$(swap_disk)' ] && echo '-drive id=swap,file=$(swap_disk),if=ide,format=raw') \
01IDE磁盘由主控制器使用,2号由从控制器使用(注意此处两个控制器偏移量不尽相同),swap_disk文件的创建参考empty_disk

新增数据结构

  1. page结构体增加如下内容:
  • PG_reference:访问标志位,表示最近页面被访问过。
  • list:页表项链表,存放所有映射page对应物理页的页表项。
  1. 内核空间新增:
  • active_list:存放访问频繁的page
  • inactive_list:存放访问不频繁的page
  • page_swapblock_map:存放换出物理页向swap_disk中磁盘块的映射关系
  • page_state_set:存放换出物理页page中状态。

新增操作

schedule刷新TLB

由于并不存在访问标志位,因此要在每次schedule时刷新对应进程的所有TLB,借助TLB重填检测页面的访问。

TLB重填逻辑

触发TLB重填时,若存在映射关系,则将对应物理页page执行如下操作:
检查pagePG_referenced标志位:

  • false且不在active_listinactive_list中:置true并将page加入inactive_list尾部。
  • false且在inactive_list:将page移动到active_list尾部,置true
  • false且在active_list:置true
  • true且在inactive_list:移动到active_list尾部。

维护Page状态

主要维护新增的list字段:

  • 页面被分配或映射时,添加相应页表项指针ptrlist
  • 页面取消映射时,移除对应页表项

实现swap_out

syscall_mem_allocpage_alloc尝试分配页面但无空闲页时触发:

  1. 使用algo算法选取一个非空闲物理页page
  2. 遍历page中的list链表,修改页表项内容标记为其为换出页面便于后续访问触发缺页中断
  3. page结构体状态保存至page_state_set,并初始化page
  4. swap_disk中找空闲磁盘块,并向其写入page物理页中的内容,标记为非空闲(位图)
  5. page作为page_alloc结果并执行后续流程

实现swap_in

若用户访问虚地址触发缺页中断且中断页page为换出页面时触发:

  1. 利用page_swapblock_map查询磁盘中非空闲块与换出页映射关系,找到page对应的磁盘块,读出内容,标记为空闲
  2. 尝试找一页空闲物理页Page(无则使用swap_out获得),将读取到的内容拷贝到Page
  3. 利用page_state_set将此前保留的结构体状态恢复至Page
  4. 遍历恢复后的list,所有页表项修改为映射Page对应物理页的正常映射关系,并将list移动到Page结构体中(?)
  5. 执行缺页异常

algo替换算法

  1. inactive_list非空,遍历inactive_list中到的page
  2. pagePG_...false,结束算法返回page
  3. 若为true,置false
  4. inactive_list空,执行shrink_active_list,并重复执行第一步

shrink_active_list

  1. 遍历active_listpage
  2. pagePG_...true,置false
  3. 否则,将page加入inactive_list

定期更新inactive_list

每隔一段时间 ,执行一次shrink_active_list