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

An updated freevm.

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