• proj8:支持页换入换出
    • proj8项目组成
    • proj8编译运行

    proj8:支持页换入换出

    proj8项目组成

    编译并运行proj8的命令如下:

    1. make
    2. make qemu

    则可以得到如下显示界面

    1. proj8
    2. ├── driver
    3. ├──
    4. ├── ide.c
    5. └── ide.h
    6. ├── fs
    7. ├── fs.h
    8. ├── swapfs.c
    9. └── swapfs.h
    10. ├── mm
    11. ├── ……
    12. ├── memlayout.h
    13. ├── pmm.c
    14. ├── swap.c
    15. ├── swap.h
    16. ├── vmm.c
    17. └── vmm.h
    18. ├── sync
    19. └── sync.h
    20. └── trap
    21. ├── trap.c
    22. └── ……
    23. ├── libs
    24. ├── hash.c
    25. └── ……
    26. ├── ……

    相对于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编译运行

    1. (THU.CST) os is loading ...
    2. Special kernel symbols:
    3. entry 0xc010002c (phys)
    4. etext 0xc010dfec (phys)
    5. edata 0xc012faa8 (phys)
    6. end 0xc0132e20 (phys)
    7. Kernel executable memory footprint: 204KB
    8. memory managment: buddy_pmm_manager
    9. e820map:
    10. memory: 0009f400, [00000000, 0009f3ff], type = 1.
    11. memory: 00000c00, [0009f400, 0009ffff], type = 2.
    12. memory: 00010000, [000f0000, 000fffff], type = 2.
    13. memory: 07efd000, [00100000, 07ffcfff], type = 1.
    14. memory: 00003000, [07ffd000, 07ffffff], type = 2.
    15. memory: 00040000, [fffc0000, ffffffff], type = 2.
    16. check_alloc_page() succeeded!
    17. check_pgdir() succeeded!
    18. check_boot_pgdir() succeeded!
    19. -------------------- BEGIN --------------------
    20. PDE(0e0) c0000000-f8000000 38000000 urw
    21. |-- PTE(38000) c0000000-f8000000 38000000 -rw
    22. PDE(001) fac00000-fb000000 00400000 -rw
    23. |-- PTE(000e0) faf00000-fafe0000 000e0000 urw
    24. |-- PTE(00001) fafeb000-fafec000 00001000 -rw
    25. --------------------- END ---------------------
    26. check_slab() succeeded!
    27. check_vma_struct() succeeded!
    28. page fault at 0x00000100: K/W [no page found].
    29. check_pgfault() succeeded!
    30. check_vmm() succeeded.
    31. ide 0: 10000(sectors), 'QEMU HARDDISK'.
    32. ide 1: 262144(sectors), 'QEMU HARDDISK'.
    33. page fault at 0x00000000: K/W [no page found].
    34. page fault at 0x00000000: K/W [no page found].
    35. page fault at 0x00001001: K/W [no page found].
    36. page fault at 0x00001000: K/R [no page found].
    37. page fault at 0x00000000: K/R [no page found].
    38. check_swap() succeeded.
    39. ++ setup timer interrupts
    40. 100 ticks

    check_swap函数对ucore在proj8中建立的双链页面置换策略进行了测试,验证了其正确性,下面我们将从原理和实际实现两个方面来分析proj8中实现的页面置换算法。