Skip to content
Snippets Groups Projects
Commit d9818bdd authored by Frans Kaashoek's avatar Frans Kaashoek
Browse files

Make Austin happier

2011
parent a4b213cf
No related branches found
No related tags found
No related merge requests found
......@@ -26,7 +26,7 @@ In addition, we are grateful for the patches contributed by Greg
Price, Yandong Mao, and Hitoshi Mitake.
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
......
......@@ -18,7 +18,7 @@ seginit(void)
{
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
// because it would have to have DPL_USR, but the CPU forbids
// an interrupt from CPL=0 to DPL=3.
......@@ -40,7 +40,7 @@ seginit(void)
}
// 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.
static pte_t *
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)];
}
// 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
// be page-aligned.
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;
pte_t *pte;
a = PGROUNDDOWN(la);
last = PGROUNDDOWN(la + size - 1);
a = PGROUNDDOWN(va);
last = PGROUNDDOWN(va + size - 1);
for(;;){
pte = walkpgdir(pgdir, a, alloc);
if(pte == 0)
......@@ -90,7 +90,7 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(vo
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).
// There is one page table per process, plus one that's used
// 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
// than its memory.
//
//
// setupkvm() and exec() set up every page table like this:
// 0..USERTOP : user memory (text, data, stack, heap), mapped to some unused phys mem
// 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
// the bottom of the address space, and the kernel at the top at KERNBASE.
static struct kmap {
void *l;
uint p;
uint e;
void *virt;
uint phys_start;
uint phys_end;
int perm;
} kmap[] = {
{ 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);
k = kmap;
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 pgdir;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment