提交 547c28fc 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

Don't map IO space in the user part of the address space

Passes all tests now (but need to update usertests to allow for more than 640k)
上级 9aa0337d
...@@ -56,7 +56,7 @@ kfree(char *v) ...@@ -56,7 +56,7 @@ kfree(char *v)
{ {
struct run *r; struct run *r;
if((uint)v % PGSIZE || v < end || v2p(v) >= PHYSTOP) if((uint)v % PGSIZE || v < end || v2p(v) >= PHYSTOP)
panic("kfree"); panic("kfree");
// Fill with junk to catch dangling refs. // Fill with junk to catch dangling refs.
...@@ -82,7 +82,6 @@ kalloc(void) ...@@ -82,7 +82,6 @@ kalloc(void)
if(r) if(r)
kmem.freelist = r->next; kmem.freelist = r->next;
release(&kmem.lock); release(&kmem.lock);
cprintf("kalloc: 0x%x\n", r);
return (char*)r; return (char*)r;
} }
...@@ -175,7 +175,6 @@ static struct kmap { ...@@ -175,7 +175,6 @@ static struct kmap {
uint e; uint e;
int perm; int perm;
} kmap[] = { } kmap[] = {
{ (void *)IOSPACEB, IOSPACEB, IOSPACEE, PTE_W}, // I/O space
{ P2V(IOSPACEB), IOSPACEB, IOSPACEE, PTE_W}, // I/O space { P2V(IOSPACEB), IOSPACEB, IOSPACEE, PTE_W}, // I/O space
{ (void *)KERNLINK, V2P(KERNLINK), V2P(data), 0}, // kernel text, rodata { (void *)KERNLINK, V2P(KERNLINK), V2P(data), 0}, // kernel text, rodata
{ data, V2P(data), PHYSTOP, PTE_W}, // kernel data, memory { data, V2P(data), PHYSTOP, PTE_W}, // kernel data, memory
...@@ -288,7 +287,7 @@ loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) ...@@ -288,7 +287,7 @@ loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
n = sz - i; n = sz - i;
else else
n = PGSIZE; n = PGSIZE;
if(readi(ip, (char*)pa, offset+i, n) != n) if(readi(ip, p2v(pa), offset+i, n) != n)
return -1; return -1;
} }
return 0; return 0;
...@@ -341,7 +340,8 @@ deallocuvm(pde_t *pgdir, uint oldsz, uint newsz) ...@@ -341,7 +340,8 @@ deallocuvm(pde_t *pgdir, uint oldsz, uint newsz)
pa = PTE_ADDR(*pte); pa = PTE_ADDR(*pte);
if(pa == 0) if(pa == 0)
panic("kfree"); panic("kfree");
kfree((char*)pa); char *v = p2v(pa);
kfree(v);
*pte = 0; *pte = 0;
} }
} }
...@@ -359,8 +359,10 @@ freevm(pde_t *pgdir) ...@@ -359,8 +359,10 @@ freevm(pde_t *pgdir)
panic("freevm: no pgdir"); panic("freevm: no pgdir");
deallocuvm(pgdir, USERTOP, 0); deallocuvm(pgdir, USERTOP, 0);
for(i = 0; i < NPDENTRIES; i++){ for(i = 0; i < NPDENTRIES; i++){
if(pgdir[i] & PTE_P) if(pgdir[i] & PTE_P) {
kfree(p2v(PTE_ADDR(pgdir[i]))); char * v = p2v(PTE_ADDR(pgdir[i]));
kfree(v);
}
} }
kfree((char*)pgdir); kfree((char*)pgdir);
} }
...@@ -385,7 +387,7 @@ copyuvm(pde_t *pgdir, uint sz) ...@@ -385,7 +387,7 @@ copyuvm(pde_t *pgdir, uint sz)
pa = PTE_ADDR(*pte); pa = PTE_ADDR(*pte);
if((mem = kalloc()) == 0) if((mem = kalloc()) == 0)
goto bad; goto bad;
memmove(mem, (char*)pa, PGSIZE); memmove(mem, (char*)p2v(pa), PGSIZE);
if(mappages(d, (void*)i, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0) if(mappages(d, (void*)i, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0)
goto bad; goto bad;
} }
...@@ -397,7 +399,7 @@ bad: ...@@ -397,7 +399,7 @@ bad:
} }
//PAGEBREAK! //PAGEBREAK!
// Map user virtual address to kernel physical address. // Map user virtual address to kernel address.
char* char*
uva2ka(pde_t *pgdir, char *uva) uva2ka(pde_t *pgdir, char *uva)
{ {
...@@ -408,7 +410,7 @@ uva2ka(pde_t *pgdir, char *uva) ...@@ -408,7 +410,7 @@ uva2ka(pde_t *pgdir, char *uva)
return 0; return 0;
if((*pte & PTE_U) == 0) if((*pte & PTE_U) == 0)
return 0; return 0;
return (char*)PTE_ADDR(*pte); return (char*)p2v(PTE_ADDR(*pte));
} }
// Copy len bytes from p to user address va in page table pgdir. // Copy len bytes from p to user address va in page table pgdir.
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论