Skip to content

Commit 0255791

Browse files
committed
update lab4
1 parent 08b012b commit 0255791

2 files changed

Lines changed: 14 additions & 39 deletions

File tree

src/content/docs/lab4/01-overview.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ user_stack_bottom ├──────────────────
151151

152152
```
153153
0xFFFF_FFFF_FFFF_F000 ┌──────────────────┐ Trampoline(与物理地址对齐)
154-
│ MMIO 寄存器 │ 恒等映射
154+
(trampoline的虚拟地址) │ MMIO 寄存器 │ 恒等映射
155155
│ 物理内存 │ 恒等映射
156156
│ .bss/.data │ 恒等映射
157157
│ .rodata │ 恒等映射

src/content/docs/lab4/03-page-table.mdx

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -104,21 +104,17 @@ fn find_pte_create(&mut self, vpn: VirtPageNum) -> Option<&mut PageTableEntry>
104104
vpn.indexes() = [i0, i1, i2] // [VPN[2], VPN[1], VPN[0]]
105105

106106
1. 查找 i0
107-
ppn = self.root_ppn
108-
pte = ppn.get_pte_array()[i0]
109107
pte.is_valid() == false
110108
分配新帧 frame,令 pte = PageTableEntry::new(frame.ppn, V)
111109
frame 存入 self.frames(转移所有权)
112-
ppn = pte.ppn() // 进入二级页表
110+
进入二级页表
113111

114-
1. 查找 i1
115-
pte = ppn.get_pte_array()[i1]
116-
(同上,若不存在则分配新帧)
117-
ppn = pte.ppn() // 进入三级页表
112+
2. 查找 i1
113+
同上,若不存在则分配新帧
114+
进入三级页表
118115

119-
1. 查找 i2
120-
pte = &mut ppn.get_pte_array()[i2]
121-
直接返回该 PTE 的可变引用(叶子节点,不判断 valid
116+
3. 查找 i2
117+
直接返回该 PTE 的可变引用
122118
```
123119

124120
<Aside type="note">
@@ -143,22 +139,7 @@ fn find_pte(&self, vpn: VirtPageNum) -> Option<&mut PageTableEntry>
143139
| 中间节点缺失 | 分配新帧并创建节点 | 返回 `None` |
144140
| 用途 | 建立新映射(`map`) | 查询/删除现有映射(`translate`, `unmap`) |
145141

146-
**遍历过程:**
147-
148-
```
149-
vpn.indexes() = [i0, i1, i2]
150-
151-
ppn = self.root_ppn
152-
pte = ppn.get_pte_array()[i0]
153-
!pte.is_valid() → return None
154-
155-
ppn = pte.ppn()
156-
pte = ppn.get_pte_array()[i1]
157-
!pte.is_valid() → return None
158-
159-
ppn = pte.ppn()
160-
return Some(&mut ppn.get_pte_array()[i2])
161-
```
142+
> 参考`find_pte_create`函数,仔细思考其中区别
162143

163144
### 3. `map` —— 建立 VPNPPN 映射
164145

@@ -172,14 +153,11 @@ pub fn map(&mut self, vpn: VirtPageNum, ppn: PhysPageNum, flags: PTEFlags)
172153
**实现逻辑:**
173154

174155
```
175-
1. pte = self.find_pte_create(vpn).unwrap()
176-
// 找到(或创建)叶子节点
156+
1. 找到(或创建)叶子节点
177157

178-
2. assert!(!pte.is_valid())
179-
// 断言:该 VPN 尚未被映射(防御性检查,避免重复映射)
158+
2. 检查该 VPN 尚未被映射(防御性检查,避免重复映射)
180159

181-
3. *pte = PageTableEntry::new(ppn, flags | PTEFlags::V)
182-
// 写入 PPN 和权限标志,并置位 V(使映射有效)
160+
3. 写入 PPN 和权限标志,并置位 V(使映射有效)
183161
```
184162

185163
<Aside type="caution">
@@ -199,14 +177,11 @@ pub fn unmap(&mut self, vpn: VirtPageNum)
199177
**实现逻辑:**
200178

201179
```
202-
1. pte = self.find_pte(vpn).unwrap()
203-
// 找到叶子节点(若不存在则 panic)
180+
1. 找到叶子节点(若不存在则 panic
204181

205-
2. assert!(pte.is_valid())
206-
// 断言:该映射确实存在
182+
2. 检查该映射确实存在
207183

208-
3. *pte = PageTableEntry::empty()
209-
// 将 PTE 清零(等价于 bits = 0),V 位变为 0,映射失效
184+
3.PTE 清零(等价于 bits = 0),V 位变为 0,映射失效
210185
```
211186

212187
<Aside type="tip">

0 commit comments

Comments
 (0)