| 258 | } |
| 259 | |
| 260 | void MemoryManager::releasePages(enum AddressPoolType type, const int virtualAddress, const int count) |
| 261 | { |
| 262 | int vaddr = virtualAddress; |
| 263 | int *pte; |
| 264 | for (int i = 0; i < count; ++i, vaddr += PAGE_SIZE) |
| 265 | { |
| 266 | // 第一步,对每一个虚拟页,释放为其分配的物理页 |
| 267 | releasePhysicalPages(type, vaddr2paddr(vaddr), 1); |
| 268 | |
| 269 | // 设置页表项为不存在,防止释放后被再次使用 |
| 270 | pte = (int *)toPTE(vaddr); |
| 271 | *pte = 0; |
| 272 | } |
| 273 | |
| 274 | // 第二步,释放虚拟页 |
| 275 | releaseVirtualPages(type, virtualAddress, count); |
| 276 | } |
| 277 | |
| 278 | int MemoryManager::vaddr2paddr(int vaddr) |
| 279 | { |