文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
proj8:支持页换入换出
proj8 项目组成
编译并运行 proj8 的命令如下:
make
make qemu
则可以得到如下显示界面
proj8
│ ├── driver
│ │ ├── …
│ │ ├── ide.c
│ │ └── ide.h
│ ├── fs
│ │ ├── fs.h
│ │ ├── swapfs.c
│ │ └── swapfs.h
│ ├── mm
│ │ ├── ……
│ │ ├── memlayout.h
│ │ ├── pmm.c
│ │ ├── swap.c
│ │ ├── swap.h
│ │ ├── vmm.c
│ │ └── vmm.h
│ ├── sync
│ │ └── sync.h
│ └── trap
│ ├── trap.c
│ └── ……
├── libs
│ ├── hash.c
│ └── ……
├── ……
相对于 proj7,proj8 主要修改和增加的文件如下:
- ide.[ch]:实现了对 IDE 硬盘的 PIO 方式的扇区读写功能,用于支持把页换入和换出硬盘。
- swapfs.[ch]:根据页和硬盘扇区的映射关系,实现了在 IDE 硬盘上的 swap 文件组织,并实现了把页写入 swap 文件和从 swap 文件读入页的功能。需要 ide.[ch]的支持。
- swap.[ch]:参考 Linux2.4 的页替换策略,实现了一个简化的双链表页替换策略。
- memlayout.h:修改 Page 等关键数据结构,支持双链页替换策略。
- pmm.c:修改 page_remove_pte 函数,支持双链页替换策略。
- vmm.c:修改 do_pgfault 函数,支持页的换入换出。
- sync.h:增加 lock/unlock 支持,支持页的换入换出过程不会出现 race condition 现象。
proj8 编译运行
(THU.CST) os is loading ...
Special kernel symbols:
entry 0xc010002c (phys)
etext 0xc010dfec (phys)
edata 0xc012faa8 (phys)
end 0xc0132e20 (phys)
Kernel executable memory footprint: 204KB
memory managment: buddy_pmm_manager
e820map:
memory: 0009f400, [00000000, 0009f3ff], type = 1.
memory: 00000c00, [0009f400, 0009ffff], type = 2.
memory: 00010000, [000f0000, 000fffff], type = 2.
memory: 07efd000, [00100000, 07ffcfff], type = 1.
memory: 00003000, [07ffd000, 07ffffff], type = 2.
memory: 00040000, [fffc0000, ffffffff], type = 2.
check_alloc_page() succeeded!
check_pgdir() succeeded!
check_boot_pgdir() succeeded!
- - - - - - - - - - BEGIN - - - - - - - - - -
PDE(0e0) c0000000-f8000000 38000000 urw
| - PTE(38000) c0000000-f8000000 38000000 -rw
PDE(001) fac00000-fb000000 00400000 -rw
| - PTE(000e0) faf00000-fafe0000 000e0000 urw
| - PTE(00001) fafeb000-fafec000 00001000 -rw
- - - - - - - - - - - END - - - - - - - - - - -
check_slab() succeeded!
check_vma_struct() succeeded!
page fault at 0x00000100: K/W [no page found].
check_pgfault() succeeded!
check_vmm() succeeded.
ide 0: 10000(sectors), 'QEMU HARDDISK'.
ide 1: 262144(sectors), 'QEMU HARDDISK'.
page fault at 0x00000000: K/W [no page found].
page fault at 0x00000000: K/W [no page found].
page fault at 0x00001001: K/W [no page found].
page fault at 0x00001000: K/R [no page found].
page fault at 0x00000000: K/R [no page found].
check_swap() succeeded.
++ setup timer interrupts
100 ticks
check_swap 函数对 ucore 在 proj8 中建立的双链页面置换策略进行了测试,验证了其正确性,下面我们将从原理和实际实现两个方面来分析 proj8 中实现的页面置换算法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论