Make Austin happier

2011
This commit is contained in:
Frans Kaashoek 2011-08-15 20:21:14 -04:00
parent a4b213cf49
commit d9818bdd7d
2 changed files with 13 additions and 13 deletions

2
README
View file

@ -26,7 +26,7 @@ In addition, we are grateful for the patches contributed by Greg
Price, Yandong Mao, and Hitoshi Mitake. Price, Yandong Mao, and Hitoshi Mitake.
The code in the files that constitute xv6 is The code in the files that constitute xv6 is
Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox. Copyright 2006-2011 Frans Kaashoek, Robert Morris, and Russ Cox.
ERROR REPORTS ERROR REPORTS

24
vm.c
View file

@ -18,7 +18,7 @@ seginit(void)
{ {
struct cpu *c; struct cpu *c;
// Map virtual addresses to linear addresses using identity map. // Map "logical" addresses to virtual addresses using identity map.
// Cannot share a CODE descriptor for both kernel and user // Cannot share a CODE descriptor for both kernel and user
// because it would have to have DPL_USR, but the CPU forbids // because it would have to have DPL_USR, but the CPU forbids
// an interrupt from CPL=0 to DPL=3. // an interrupt from CPL=0 to DPL=3.
@ -40,7 +40,7 @@ seginit(void)
} }
// Return the address of the PTE in page table pgdir // Return the address of the PTE in page table pgdir
// that corresponds to linear address va. If alloc!=0, // that corresponds to virtual address va. If alloc!=0,
// create any required page table pages. // create any required page table pages.
static pte_t * static pte_t *
walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void)) walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
@ -64,17 +64,17 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
return &pgtab[PTX(va)]; return &pgtab[PTX(va)];
} }
// Create PTEs for linear addresses starting at la that refer to // Create PTEs for virtual addresses starting at la that refer to
// physical addresses starting at pa. la and size might not // physical addresses starting at pa. la and size might not
// be page-aligned. // be page-aligned.
static int static int
mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(void)) mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm, char* (*alloc)(void))
{ {
char *a, *last; char *a, *last;
pte_t *pte; pte_t *pte;
a = PGROUNDDOWN(la); a = PGROUNDDOWN(va);
last = PGROUNDDOWN(la + size - 1); last = PGROUNDDOWN(va + size - 1);
for(;;){ for(;;){
pte = walkpgdir(pgdir, a, alloc); pte = walkpgdir(pgdir, a, alloc);
if(pte == 0) if(pte == 0)
@ -90,7 +90,7 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
return 0; return 0;
} }
// The mappings from logical to linear are one to one (i.e., // The mappings from logical to virtual are one to one (i.e.,
// segmentation doesn't do anything). // segmentation doesn't do anything).
// There is one page table per process, plus one that's used // There is one page table per process, plus one that's used
// when a CPU is not running any process (kpgdir). // when a CPU is not running any process (kpgdir).
@ -98,7 +98,6 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
// page protection bits prevent it from using anything other // page protection bits prevent it from using anything other
// than its memory. // than its memory.
// //
//
// setupkvm() and exec() set up every page table like this: // setupkvm() and exec() set up every page table like this:
// 0..USERTOP : user memory (text, data, stack, heap), mapped to some unused phys mem // 0..USERTOP : user memory (text, data, stack, heap), mapped to some unused phys mem
// KERNBASE..KERNBASE+1M: mapped to 0..1M // KERNBASE..KERNBASE+1M: mapped to 0..1M
@ -112,9 +111,9 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
// (which is inaccessible in user mode). The user program sits in // (which is inaccessible in user mode). The user program sits in
// the bottom of the address space, and the kernel at the top at KERNBASE. // the bottom of the address space, and the kernel at the top at KERNBASE.
static struct kmap { static struct kmap {
void *l; void *virt;
uint p; uint phys_start;
uint e; uint phys_end;
int perm; int perm;
} kmap[] = { } kmap[] = {
{ P2V(0), 0, 1024*1024, PTE_W}, // First 1Mbyte contains BIOS and some IO devices { P2V(0), 0, 1024*1024, PTE_W}, // First 1Mbyte contains BIOS and some IO devices
@ -135,7 +134,8 @@ setupkvm(char* (*alloc)(void))
memset(pgdir, 0, PGSIZE); memset(pgdir, 0, PGSIZE);
k = kmap; k = kmap;
for(k = kmap; k < &kmap[NELEM(kmap)]; k++) for(k = kmap; k < &kmap[NELEM(kmap)]; k++)
if(mappages(pgdir, k->l, k->e - k->p, (uint)k->p, k->perm, alloc) < 0) if(mappages(pgdir, k->virt, k->phys_end - k->phys_start, (uint)k->phys_start,
k->perm, alloc) < 0)
return 0; return 0;
return pgdir; return pgdir;