提交 4c0143d2 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

An updated freevm.

上级 8d068b51
......@@ -101,7 +101,7 @@ fs.img: mkfs README $(UPROGS)
clean:
rm -f *.o *.d *.asm *.sym initcode kernel bootother mkfs fs.img
QEMUOPTS = -smp $(CPUS) -m 512
QEMUOPTS = -smp $(CPUS) -m 512 -nographic
qemu: kernel
$(QEMU) $(QEMUOPTS) -kernel kernel
gdb: kernel
......
......@@ -15,7 +15,6 @@ typedef uint64 u64;
typedef uint64 uptr;
typedef uptr paddr;
typedef u64 pme_t; // Page Map Entry (refers to any entry in any level)
typedef pme_t pml4e_t;
......
......@@ -161,20 +161,40 @@ vma_free(void *p)
kmfree(e);
}
static void
freepm(pme_t *pm, int level)
{
int i;
if (level != 0) {
for (i = 0; i < 512; i++) {
if (pm[i] & PTE_P)
freepm(p2v(PTE_ADDR(pm[i])), level - 1);
}
}
kfree(pm);
}
// Free a page table and all the physical memory pages
// in the user part.
static void
freevm(pml4e_t *pml4)
{
int k;
int i;
if(pml4 == 0)
panic("freevm: no pgdir");
cprintf("freevm: XXX leaking..\n");
#if 0
for(i = 0; i < 1024; i++){
if(pgdir[i] & PTE_P)
kfree(p2v(PTE_ADDR(pgdir[i])));
// Don't free kernel portion of the pml4
k = PX(3, PBASE);
for (i = 0; i < k; i++) {
if (pml4[i] & PTE_P) {
freepm(p2v(PTE_ADDR(pml4[i])), 2);
}
#endif
}
kfree(pml4);
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论