@@ -104,21 +104,17 @@ fn find_pte_create(&mut self, vpn: VirtPageNum) -> Option<&mut PageTableEntry>
104104vpn . indexes () = [i0 , i1 , i2 ] // [VPN[2], VPN[1], VPN[0]]
105105
1061061 . 查找 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 ` —— 建立 VPN → PPN 映射
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