Make Austin happier
2011
This commit is contained in:
parent
a4b213cf49
commit
d9818bdd7d
2 changed files with 13 additions and 13 deletions
2
README
2
README
|
@ -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
24
vm.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue