> For the complete documentation index, see [llms.txt](https://nankai.gitbook.io/ucore-os-on-risc-v64/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nankai.gitbook.io/ucore-os-on-risc-v64/lab3/xiang-mu-zu-cheng-yu-zhi-hang-liu.md).

# 项目组成与执行流

## 项目组成

```
lab3
├── Makefile
├── kern
│   ├── debug
│   │   ├── assert.h
│   │   ├── kdebug.c
│   │   ├── kdebug.h
│   │   ├── kmonitor.c
│   │   ├── kmonitor.h
│   │   ├── panic.c
│   │   └── stab.h
│   ├── driver
│   │   ├── clock.c
│   │   ├── clock.h
│   │   ├── console.c
│   │   ├── console.h
│   │   ├── ide.c
│   │   ├── ide.h
│   │   ├── intr.c
│   │   └── intr.h
│   ├── fs
│   │   ├── fs.h
│   │   ├── swapfs.c
│   │   └── swapfs.h
│   ├── init
│   │   ├── entry.S
│   │   └── init.c
│   ├── libs
│   │   └── stdio.c
│   ├── mm
│   │   ├── default_pmm.c
│   │   ├── default_pmm.h
│   │   ├── memlayout.h
│   │   ├── mmu.h
│   │   ├── pmm.c
│   │   ├── pmm.h
│   │   ├── swap.c
│   │   ├── swap.h
│   │   ├── swap_clock.c
│   │   ├── swap_clock.h
│   │   ├── swap_fifo.c
│   │   ├── swap_fifo.h
│   │   ├── vmm.c
│   │   └── vmm.h
│   ├── sync
│   │   └── sync.h
│   └── trap
│       ├── trap.c
│       ├── trap.h
│       └── trapentry.S
├── lab3.md
├── libs
│   ├── atomic.h
│   ├── defs.h
│   ├── error.h
│   ├── list.h
│   ├── printfmt.c
│   ├── rand.c
│   ├── readline.c
│   ├── riscv.h
│   ├── sbi.h
│   ├── stdarg.h
│   ├── stdio.h
│   ├── stdlib.h
│   ├── string.c
│   └── string.h
└── tools
    ├── boot.ld
    ├── function.mk
    ├── gdbinit
    ├── grade.sh
    ├── kernel.ld
    ├── sign.c
    └── vector.c

11 directories, 62 files
```

## 页面定义

`kern/mm/memlayout.h`：修改了`struct Page`，增加了两项`pra_*`成员结构，其中`pra_page_link`可以用来建立描述各个页访问情况（比如根据访问先后）的链表。在本实验中会涉及使用这两个成员结构，以及`le2page`等宏。

## 虚拟内存信息

`kern/mm/vmm.[ch]`：`vmm.h`描述了`mm_struct`，`vma_struct`等表述可访问的虚存地址访问的一些信息，下面会进一步详细讲解。`vmm.c`涉及`mm,vma`结构数据的创建/销毁/查找/插入等函数，这些函数在`check_vma`、`check_vmm`等中被使用，理解即可。而`page fault`处理相关的`do_pgfault`函数是本次实验需要涉及完成的。

## 替换算法框架

`kern/mm/swap.[ch]`：定义了实现页替换算法类框架`struct swap_manager`。`swap.c`包含了对此页替换算法类框架的初始化、页换入/换出等各种函数实现。重点是要理解何时调用`swap_out`和`swap_in`函数。和如何在此框架下连接具体的页替换算法实现。

## FIFO算法

`kern/mm/swap_fifo.[ch]`：演示的算法实现。

## Clock算法

`kern/mm/swap_clock.[ch]`：需要自己实现的算法，有注释提示。

## 执行流

结合前面所述自行理解、总结。
