diff --git a/Makefile b/Makefile index 7fbd99e..e71e6b6 100644 --- a/Makefile +++ b/Makefile @@ -72,7 +72,8 @@ AS = $(TOOLPREFIX)gas LD = $(TOOLPREFIX)ld OBJCOPY = $(TOOLPREFIX)objcopy OBJDUMP = $(TOOLPREFIX)objdump -CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) ASFLAGS = -m32 -gdwarf-2 -Wa,-divide # FreeBSD ld wants ``elf_i386_fbsd'' @@ -198,7 +199,7 @@ QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \ then echo "-gdb tcp::$(GDBPORT)"; \ else echo "-s -p $(GDBPORT)"; fi) ifndef CPUS -CPUS := 2 +CPUS := 1 endif QEMUOPTS = -hdb fs.img xv6.img -smp $(CPUS) -m 512 diff --git a/defs.h b/defs.h index 54ea14d..b1cdefb 100644 --- a/defs.h +++ b/defs.h @@ -62,7 +62,7 @@ extern uchar ioapicid; void ioapicinit(void); // kalloc.c -char* pgalloc(void); +char* boot_alloc(void); char* kalloc(void); void kfree(char*); void kinit(void); @@ -161,11 +161,10 @@ void uartintr(void); void uartputc(int); // vm.c -void pginit(char* (*alloc)()); void seginit(void); void kvmalloc(void); void vmenable(void); -pde_t* setupkvm(void); +pde_t* setupkvm(char* (*alloc)()); char* uva2ka(pde_t*, char*); int allocuvm(pde_t*, uint, uint); int deallocuvm(pde_t*, uint, uint); diff --git a/exec.c b/exec.c index 9186cfb..2ec1c51 100644 --- a/exec.c +++ b/exec.c @@ -29,7 +29,7 @@ exec(char *path, char **argv) if(elf.magic != ELF_MAGIC) goto bad; - if((pgdir = setupkvm()) == 0) + if((pgdir = setupkvm(kalloc)) == 0) goto bad; // Load program into memory. diff --git a/kalloc.c b/kalloc.c index cc6d380..cf89dd4 100644 --- a/kalloc.c +++ b/kalloc.c @@ -23,11 +23,13 @@ char *newend; // simple page allocator to get off the ground during boot char * -pgalloc(void) +boot_alloc(void) { if (newend == 0) newend = end; + if ((uint) newend >= KERNBASE + 0x400000) + panic("only first 4Mbyte are mapped during boot"); void *p = (void*)PGROUNDUP((uint)newend); memset(p, 0, PGSIZE); newend = newend + PGSIZE; diff --git a/main.c b/main.c index d596cec..6097d55 100644 --- a/main.c +++ b/main.c @@ -12,19 +12,20 @@ void jmpkstack(void) __attribute__((noreturn)); void mainc(void); static volatile int newpgdir; - // Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { - pginit(pgalloc); + kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(mpbcpu()); seginit(); // set up segments kinit(); // initialize memory allocator - jmpkstack(); // call mainc() on a properly-allocated stack + jmpkstack(); // call mainc() on a properly-allocated stack XXX ax + mainc(); + return 0; } void @@ -60,7 +61,6 @@ mainc(void) timerinit(); // uniprocessor timer userinit(); // first user process bootothers(); // start other processors - kvmalloc(); // new kernel page table wo. bottom mapped newpgdir = 1; // Finish setting up this processor in mpmain. mpmain(); @@ -126,6 +126,1060 @@ bootothers(void) } } +// Boot page table used in multiboot.S. +// Page directories (and page tables), must start on a page boundary, +// hence the "__aligned__" attribute. Also, because of restrictions +// related to linking and static initializers, we use "x + PTE_P" +// here, rather than the more standard "x | PTE_P". Everywhere else +// you should use "|" to combine flags. +pte_t entry_pgtable[NPTENTRIES]; +pte_t dev_pgtable[NPTENTRIES]; + +__attribute__((__aligned__(PGSIZE))) +pde_t bootpgdir[NPDENTRIES] = { + // Map VA's [0, 4MB) to PA's [0, 4MB) + [0] + = ((uint)entry_pgtable - KERNBASE) + PTE_P, + // Map VA's [KERNBASE, KERNBASE+4MB) to PA's [0, 4MB) + [KERNBASE>>PDXSHIFT] + = ((uint)entry_pgtable - KERNBASE) + PTE_P + PTE_W, + // Map VA's [DEVSPACE, DEVSPACE+4MB) to PA's [DEVSPACE, 4MB) + [0xFEE00000>>PDXSHIFT] + = ((uint)dev_pgtable - KERNBASE) + PTE_P + PTE_W, +}; + +// XXX switch to super pages + +// Entry 0 of the page table maps to physical page 0, entry 1 to +// physical page 1, etc. +__attribute__((__aligned__(PGSIZE))) +pte_t entry_pgtable[NPTENTRIES] = { + 0x000000 | PTE_P | PTE_W, + 0x001000 | PTE_P | PTE_W, + 0x002000 | PTE_P | PTE_W, + 0x003000 | PTE_P | PTE_W, + 0x004000 | PTE_P | PTE_W, + 0x005000 | PTE_P | PTE_W, + 0x006000 | PTE_P | PTE_W, + 0x007000 | PTE_P | PTE_W, + 0x008000 | PTE_P | PTE_W, + 0x009000 | PTE_P | PTE_W, + 0x00a000 | PTE_P | PTE_W, + 0x00b000 | PTE_P | PTE_W, + 0x00c000 | PTE_P | PTE_W, + 0x00d000 | PTE_P | PTE_W, + 0x00e000 | PTE_P | PTE_W, + 0x00f000 | PTE_P | PTE_W, + 0x010000 | PTE_P | PTE_W, + 0x011000 | PTE_P | PTE_W, + 0x012000 | PTE_P | PTE_W, + 0x013000 | PTE_P | PTE_W, + 0x014000 | PTE_P | PTE_W, + 0x015000 | PTE_P | PTE_W, + 0x016000 | PTE_P | PTE_W, + 0x017000 | PTE_P | PTE_W, + 0x018000 | PTE_P | PTE_W, + 0x019000 | PTE_P | PTE_W, + 0x01a000 | PTE_P | PTE_W, + 0x01b000 | PTE_P | PTE_W, + 0x01c000 | PTE_P | PTE_W, + 0x01d000 | PTE_P | PTE_W, + 0x01e000 | PTE_P | PTE_W, + 0x01f000 | PTE_P | PTE_W, + 0x020000 | PTE_P | PTE_W, + 0x021000 | PTE_P | PTE_W, + 0x022000 | PTE_P | PTE_W, + 0x023000 | PTE_P | PTE_W, + 0x024000 | PTE_P | PTE_W, + 0x025000 | PTE_P | PTE_W, + 0x026000 | PTE_P | PTE_W, + 0x027000 | PTE_P | PTE_W, + 0x028000 | PTE_P | PTE_W, + 0x029000 | PTE_P | PTE_W, + 0x02a000 | PTE_P | PTE_W, + 0x02b000 | PTE_P | PTE_W, + 0x02c000 | PTE_P | PTE_W, + 0x02d000 | PTE_P | PTE_W, + 0x02e000 | PTE_P | PTE_W, + 0x02f000 | PTE_P | PTE_W, + 0x030000 | PTE_P | PTE_W, + 0x031000 | PTE_P | PTE_W, + 0x032000 | PTE_P | PTE_W, + 0x033000 | PTE_P | PTE_W, + 0x034000 | PTE_P | PTE_W, + 0x035000 | PTE_P | PTE_W, + 0x036000 | PTE_P | PTE_W, + 0x037000 | PTE_P | PTE_W, + 0x038000 | PTE_P | PTE_W, + 0x039000 | PTE_P | PTE_W, + 0x03a000 | PTE_P | PTE_W, + 0x03b000 | PTE_P | PTE_W, + 0x03c000 | PTE_P | PTE_W, + 0x03d000 | PTE_P | PTE_W, + 0x03e000 | PTE_P | PTE_W, + 0x03f000 | PTE_P | PTE_W, + 0x040000 | PTE_P | PTE_W, + 0x041000 | PTE_P | PTE_W, + 0x042000 | PTE_P | PTE_W, + 0x043000 | PTE_P | PTE_W, + 0x044000 | PTE_P | PTE_W, + 0x045000 | PTE_P | PTE_W, + 0x046000 | PTE_P | PTE_W, + 0x047000 | PTE_P | PTE_W, + 0x048000 | PTE_P | PTE_W, + 0x049000 | PTE_P | PTE_W, + 0x04a000 | PTE_P | PTE_W, + 0x04b000 | PTE_P | PTE_W, + 0x04c000 | PTE_P | PTE_W, + 0x04d000 | PTE_P | PTE_W, + 0x04e000 | PTE_P | PTE_W, + 0x04f000 | PTE_P | PTE_W, + 0x050000 | PTE_P | PTE_W, + 0x051000 | PTE_P | PTE_W, + 0x052000 | PTE_P | PTE_W, + 0x053000 | PTE_P | PTE_W, + 0x054000 | PTE_P | PTE_W, + 0x055000 | PTE_P | PTE_W, + 0x056000 | PTE_P | PTE_W, + 0x057000 | PTE_P | PTE_W, + 0x058000 | PTE_P | PTE_W, + 0x059000 | PTE_P | PTE_W, + 0x05a000 | PTE_P | PTE_W, + 0x05b000 | PTE_P | PTE_W, + 0x05c000 | PTE_P | PTE_W, + 0x05d000 | PTE_P | PTE_W, + 0x05e000 | PTE_P | PTE_W, + 0x05f000 | PTE_P | PTE_W, + 0x060000 | PTE_P | PTE_W, + 0x061000 | PTE_P | PTE_W, + 0x062000 | PTE_P | PTE_W, + 0x063000 | PTE_P | PTE_W, + 0x064000 | PTE_P | PTE_W, + 0x065000 | PTE_P | PTE_W, + 0x066000 | PTE_P | PTE_W, + 0x067000 | PTE_P | PTE_W, + 0x068000 | PTE_P | PTE_W, + 0x069000 | PTE_P | PTE_W, + 0x06a000 | PTE_P | PTE_W, + 0x06b000 | PTE_P | PTE_W, + 0x06c000 | PTE_P | PTE_W, + 0x06d000 | PTE_P | PTE_W, + 0x06e000 | PTE_P | PTE_W, + 0x06f000 | PTE_P | PTE_W, + 0x070000 | PTE_P | PTE_W, + 0x071000 | PTE_P | PTE_W, + 0x072000 | PTE_P | PTE_W, + 0x073000 | PTE_P | PTE_W, + 0x074000 | PTE_P | PTE_W, + 0x075000 | PTE_P | PTE_W, + 0x076000 | PTE_P | PTE_W, + 0x077000 | PTE_P | PTE_W, + 0x078000 | PTE_P | PTE_W, + 0x079000 | PTE_P | PTE_W, + 0x07a000 | PTE_P | PTE_W, + 0x07b000 | PTE_P | PTE_W, + 0x07c000 | PTE_P | PTE_W, + 0x07d000 | PTE_P | PTE_W, + 0x07e000 | PTE_P | PTE_W, + 0x07f000 | PTE_P | PTE_W, + 0x080000 | PTE_P | PTE_W, + 0x081000 | PTE_P | PTE_W, + 0x082000 | PTE_P | PTE_W, + 0x083000 | PTE_P | PTE_W, + 0x084000 | PTE_P | PTE_W, + 0x085000 | PTE_P | PTE_W, + 0x086000 | PTE_P | PTE_W, + 0x087000 | PTE_P | PTE_W, + 0x088000 | PTE_P | PTE_W, + 0x089000 | PTE_P | PTE_W, + 0x08a000 | PTE_P | PTE_W, + 0x08b000 | PTE_P | PTE_W, + 0x08c000 | PTE_P | PTE_W, + 0x08d000 | PTE_P | PTE_W, + 0x08e000 | PTE_P | PTE_W, + 0x08f000 | PTE_P | PTE_W, + 0x090000 | PTE_P | PTE_W, + 0x091000 | PTE_P | PTE_W, + 0x092000 | PTE_P | PTE_W, + 0x093000 | PTE_P | PTE_W, + 0x094000 | PTE_P | PTE_W, + 0x095000 | PTE_P | PTE_W, + 0x096000 | PTE_P | PTE_W, + 0x097000 | PTE_P | PTE_W, + 0x098000 | PTE_P | PTE_W, + 0x099000 | PTE_P | PTE_W, + 0x09a000 | PTE_P | PTE_W, + 0x09b000 | PTE_P | PTE_W, + 0x09c000 | PTE_P | PTE_W, + 0x09d000 | PTE_P | PTE_W, + 0x09e000 | PTE_P | PTE_W, + 0x09f000 | PTE_P | PTE_W, + 0x0a0000 | PTE_P | PTE_W, + 0x0a1000 | PTE_P | PTE_W, + 0x0a2000 | PTE_P | PTE_W, + 0x0a3000 | PTE_P | PTE_W, + 0x0a4000 | PTE_P | PTE_W, + 0x0a5000 | PTE_P | PTE_W, + 0x0a6000 | PTE_P | PTE_W, + 0x0a7000 | PTE_P | PTE_W, + 0x0a8000 | PTE_P | PTE_W, + 0x0a9000 | PTE_P | PTE_W, + 0x0aa000 | PTE_P | PTE_W, + 0x0ab000 | PTE_P | PTE_W, + 0x0ac000 | PTE_P | PTE_W, + 0x0ad000 | PTE_P | PTE_W, + 0x0ae000 | PTE_P | PTE_W, + 0x0af000 | PTE_P | PTE_W, + 0x0b0000 | PTE_P | PTE_W, + 0x0b1000 | PTE_P | PTE_W, + 0x0b2000 | PTE_P | PTE_W, + 0x0b3000 | PTE_P | PTE_W, + 0x0b4000 | PTE_P | PTE_W, + 0x0b5000 | PTE_P | PTE_W, + 0x0b6000 | PTE_P | PTE_W, + 0x0b7000 | PTE_P | PTE_W, + 0x0b8000 | PTE_P | PTE_W, + 0x0b9000 | PTE_P | PTE_W, + 0x0ba000 | PTE_P | PTE_W, + 0x0bb000 | PTE_P | PTE_W, + 0x0bc000 | PTE_P | PTE_W, + 0x0bd000 | PTE_P | PTE_W, + 0x0be000 | PTE_P | PTE_W, + 0x0bf000 | PTE_P | PTE_W, + 0x0c0000 | PTE_P | PTE_W, + 0x0c1000 | PTE_P | PTE_W, + 0x0c2000 | PTE_P | PTE_W, + 0x0c3000 | PTE_P | PTE_W, + 0x0c4000 | PTE_P | PTE_W, + 0x0c5000 | PTE_P | PTE_W, + 0x0c6000 | PTE_P | PTE_W, + 0x0c7000 | PTE_P | PTE_W, + 0x0c8000 | PTE_P | PTE_W, + 0x0c9000 | PTE_P | PTE_W, + 0x0ca000 | PTE_P | PTE_W, + 0x0cb000 | PTE_P | PTE_W, + 0x0cc000 | PTE_P | PTE_W, + 0x0cd000 | PTE_P | PTE_W, + 0x0ce000 | PTE_P | PTE_W, + 0x0cf000 | PTE_P | PTE_W, + 0x0d0000 | PTE_P | PTE_W, + 0x0d1000 | PTE_P | PTE_W, + 0x0d2000 | PTE_P | PTE_W, + 0x0d3000 | PTE_P | PTE_W, + 0x0d4000 | PTE_P | PTE_W, + 0x0d5000 | PTE_P | PTE_W, + 0x0d6000 | PTE_P | PTE_W, + 0x0d7000 | PTE_P | PTE_W, + 0x0d8000 | PTE_P | PTE_W, + 0x0d9000 | PTE_P | PTE_W, + 0x0da000 | PTE_P | PTE_W, + 0x0db000 | PTE_P | PTE_W, + 0x0dc000 | PTE_P | PTE_W, + 0x0dd000 | PTE_P | PTE_W, + 0x0de000 | PTE_P | PTE_W, + 0x0df000 | PTE_P | PTE_W, + 0x0e0000 | PTE_P | PTE_W, + 0x0e1000 | PTE_P | PTE_W, + 0x0e2000 | PTE_P | PTE_W, + 0x0e3000 | PTE_P | PTE_W, + 0x0e4000 | PTE_P | PTE_W, + 0x0e5000 | PTE_P | PTE_W, + 0x0e6000 | PTE_P | PTE_W, + 0x0e7000 | PTE_P | PTE_W, + 0x0e8000 | PTE_P | PTE_W, + 0x0e9000 | PTE_P | PTE_W, + 0x0ea000 | PTE_P | PTE_W, + 0x0eb000 | PTE_P | PTE_W, + 0x0ec000 | PTE_P | PTE_W, + 0x0ed000 | PTE_P | PTE_W, + 0x0ee000 | PTE_P | PTE_W, + 0x0ef000 | PTE_P | PTE_W, + 0x0f0000 | PTE_P | PTE_W, + 0x0f1000 | PTE_P | PTE_W, + 0x0f2000 | PTE_P | PTE_W, + 0x0f3000 | PTE_P | PTE_W, + 0x0f4000 | PTE_P | PTE_W, + 0x0f5000 | PTE_P | PTE_W, + 0x0f6000 | PTE_P | PTE_W, + 0x0f7000 | PTE_P | PTE_W, + 0x0f8000 | PTE_P | PTE_W, + 0x0f9000 | PTE_P | PTE_W, + 0x0fa000 | PTE_P | PTE_W, + 0x0fb000 | PTE_P | PTE_W, + 0x0fc000 | PTE_P | PTE_W, + 0x0fd000 | PTE_P | PTE_W, + 0x0fe000 | PTE_P | PTE_W, + 0x0ff000 | PTE_P | PTE_W, + 0x100000 | PTE_P | PTE_W, + 0x101000 | PTE_P | PTE_W, + 0x102000 | PTE_P | PTE_W, + 0x103000 | PTE_P | PTE_W, + 0x104000 | PTE_P | PTE_W, + 0x105000 | PTE_P | PTE_W, + 0x106000 | PTE_P | PTE_W, + 0x107000 | PTE_P | PTE_W, + 0x108000 | PTE_P | PTE_W, + 0x109000 | PTE_P | PTE_W, + 0x10a000 | PTE_P | PTE_W, + 0x10b000 | PTE_P | PTE_W, + 0x10c000 | PTE_P | PTE_W, + 0x10d000 | PTE_P | PTE_W, + 0x10e000 | PTE_P | PTE_W, + 0x10f000 | PTE_P | PTE_W, + 0x110000 | PTE_P | PTE_W, + 0x111000 | PTE_P | PTE_W, + 0x112000 | PTE_P | PTE_W, + 0x113000 | PTE_P | PTE_W, + 0x114000 | PTE_P | PTE_W, + 0x115000 | PTE_P | PTE_W, + 0x116000 | PTE_P | PTE_W, + 0x117000 | PTE_P | PTE_W, + 0x118000 | PTE_P | PTE_W, + 0x119000 | PTE_P | PTE_W, + 0x11a000 | PTE_P | PTE_W, + 0x11b000 | PTE_P | PTE_W, + 0x11c000 | PTE_P | PTE_W, + 0x11d000 | PTE_P | PTE_W, + 0x11e000 | PTE_P | PTE_W, + 0x11f000 | PTE_P | PTE_W, + 0x120000 | PTE_P | PTE_W, + 0x121000 | PTE_P | PTE_W, + 0x122000 | PTE_P | PTE_W, + 0x123000 | PTE_P | PTE_W, + 0x124000 | PTE_P | PTE_W, + 0x125000 | PTE_P | PTE_W, + 0x126000 | PTE_P | PTE_W, + 0x127000 | PTE_P | PTE_W, + 0x128000 | PTE_P | PTE_W, + 0x129000 | PTE_P | PTE_W, + 0x12a000 | PTE_P | PTE_W, + 0x12b000 | PTE_P | PTE_W, + 0x12c000 | PTE_P | PTE_W, + 0x12d000 | PTE_P | PTE_W, + 0x12e000 | PTE_P | PTE_W, + 0x12f000 | PTE_P | PTE_W, + 0x130000 | PTE_P | PTE_W, + 0x131000 | PTE_P | PTE_W, + 0x132000 | PTE_P | PTE_W, + 0x133000 | PTE_P | PTE_W, + 0x134000 | PTE_P | PTE_W, + 0x135000 | PTE_P | PTE_W, + 0x136000 | PTE_P | PTE_W, + 0x137000 | PTE_P | PTE_W, + 0x138000 | PTE_P | PTE_W, + 0x139000 | PTE_P | PTE_W, + 0x13a000 | PTE_P | PTE_W, + 0x13b000 | PTE_P | PTE_W, + 0x13c000 | PTE_P | PTE_W, + 0x13d000 | PTE_P | PTE_W, + 0x13e000 | PTE_P | PTE_W, + 0x13f000 | PTE_P | PTE_W, + 0x140000 | PTE_P | PTE_W, + 0x141000 | PTE_P | PTE_W, + 0x142000 | PTE_P | PTE_W, + 0x143000 | PTE_P | PTE_W, + 0x144000 | PTE_P | PTE_W, + 0x145000 | PTE_P | PTE_W, + 0x146000 | PTE_P | PTE_W, + 0x147000 | PTE_P | PTE_W, + 0x148000 | PTE_P | PTE_W, + 0x149000 | PTE_P | PTE_W, + 0x14a000 | PTE_P | PTE_W, + 0x14b000 | PTE_P | PTE_W, + 0x14c000 | PTE_P | PTE_W, + 0x14d000 | PTE_P | PTE_W, + 0x14e000 | PTE_P | PTE_W, + 0x14f000 | PTE_P | PTE_W, + 0x150000 | PTE_P | PTE_W, + 0x151000 | PTE_P | PTE_W, + 0x152000 | PTE_P | PTE_W, + 0x153000 | PTE_P | PTE_W, + 0x154000 | PTE_P | PTE_W, + 0x155000 | PTE_P | PTE_W, + 0x156000 | PTE_P | PTE_W, + 0x157000 | PTE_P | PTE_W, + 0x158000 | PTE_P | PTE_W, + 0x159000 | PTE_P | PTE_W, + 0x15a000 | PTE_P | PTE_W, + 0x15b000 | PTE_P | PTE_W, + 0x15c000 | PTE_P | PTE_W, + 0x15d000 | PTE_P | PTE_W, + 0x15e000 | PTE_P | PTE_W, + 0x15f000 | PTE_P | PTE_W, + 0x160000 | PTE_P | PTE_W, + 0x161000 | PTE_P | PTE_W, + 0x162000 | PTE_P | PTE_W, + 0x163000 | PTE_P | PTE_W, + 0x164000 | PTE_P | PTE_W, + 0x165000 | PTE_P | PTE_W, + 0x166000 | PTE_P | PTE_W, + 0x167000 | PTE_P | PTE_W, + 0x168000 | PTE_P | PTE_W, + 0x169000 | PTE_P | PTE_W, + 0x16a000 | PTE_P | PTE_W, + 0x16b000 | PTE_P | PTE_W, + 0x16c000 | PTE_P | PTE_W, + 0x16d000 | PTE_P | PTE_W, + 0x16e000 | PTE_P | PTE_W, + 0x16f000 | PTE_P | PTE_W, + 0x170000 | PTE_P | PTE_W, + 0x171000 | PTE_P | PTE_W, + 0x172000 | PTE_P | PTE_W, + 0x173000 | PTE_P | PTE_W, + 0x174000 | PTE_P | PTE_W, + 0x175000 | PTE_P | PTE_W, + 0x176000 | PTE_P | PTE_W, + 0x177000 | PTE_P | PTE_W, + 0x178000 | PTE_P | PTE_W, + 0x179000 | PTE_P | PTE_W, + 0x17a000 | PTE_P | PTE_W, + 0x17b000 | PTE_P | PTE_W, + 0x17c000 | PTE_P | PTE_W, + 0x17d000 | PTE_P | PTE_W, + 0x17e000 | PTE_P | PTE_W, + 0x17f000 | PTE_P | PTE_W, + 0x180000 | PTE_P | PTE_W, + 0x181000 | PTE_P | PTE_W, + 0x182000 | PTE_P | PTE_W, + 0x183000 | PTE_P | PTE_W, + 0x184000 | PTE_P | PTE_W, + 0x185000 | PTE_P | PTE_W, + 0x186000 | PTE_P | PTE_W, + 0x187000 | PTE_P | PTE_W, + 0x188000 | PTE_P | PTE_W, + 0x189000 | PTE_P | PTE_W, + 0x18a000 | PTE_P | PTE_W, + 0x18b000 | PTE_P | PTE_W, + 0x18c000 | PTE_P | PTE_W, + 0x18d000 | PTE_P | PTE_W, + 0x18e000 | PTE_P | PTE_W, + 0x18f000 | PTE_P | PTE_W, + 0x190000 | PTE_P | PTE_W, + 0x191000 | PTE_P | PTE_W, + 0x192000 | PTE_P | PTE_W, + 0x193000 | PTE_P | PTE_W, + 0x194000 | PTE_P | PTE_W, + 0x195000 | PTE_P | PTE_W, + 0x196000 | PTE_P | PTE_W, + 0x197000 | PTE_P | PTE_W, + 0x198000 | PTE_P | PTE_W, + 0x199000 | PTE_P | PTE_W, + 0x19a000 | PTE_P | PTE_W, + 0x19b000 | PTE_P | PTE_W, + 0x19c000 | PTE_P | PTE_W, + 0x19d000 | PTE_P | PTE_W, + 0x19e000 | PTE_P | PTE_W, + 0x19f000 | PTE_P | PTE_W, + 0x1a0000 | PTE_P | PTE_W, + 0x1a1000 | PTE_P | PTE_W, + 0x1a2000 | PTE_P | PTE_W, + 0x1a3000 | PTE_P | PTE_W, + 0x1a4000 | PTE_P | PTE_W, + 0x1a5000 | PTE_P | PTE_W, + 0x1a6000 | PTE_P | PTE_W, + 0x1a7000 | PTE_P | PTE_W, + 0x1a8000 | PTE_P | PTE_W, + 0x1a9000 | PTE_P | PTE_W, + 0x1aa000 | PTE_P | PTE_W, + 0x1ab000 | PTE_P | PTE_W, + 0x1ac000 | PTE_P | PTE_W, + 0x1ad000 | PTE_P | PTE_W, + 0x1ae000 | PTE_P | PTE_W, + 0x1af000 | PTE_P | PTE_W, + 0x1b0000 | PTE_P | PTE_W, + 0x1b1000 | PTE_P | PTE_W, + 0x1b2000 | PTE_P | PTE_W, + 0x1b3000 | PTE_P | PTE_W, + 0x1b4000 | PTE_P | PTE_W, + 0x1b5000 | PTE_P | PTE_W, + 0x1b6000 | PTE_P | PTE_W, + 0x1b7000 | PTE_P | PTE_W, + 0x1b8000 | PTE_P | PTE_W, + 0x1b9000 | PTE_P | PTE_W, + 0x1ba000 | PTE_P | PTE_W, + 0x1bb000 | PTE_P | PTE_W, + 0x1bc000 | PTE_P | PTE_W, + 0x1bd000 | PTE_P | PTE_W, + 0x1be000 | PTE_P | PTE_W, + 0x1bf000 | PTE_P | PTE_W, + 0x1c0000 | PTE_P | PTE_W, + 0x1c1000 | PTE_P | PTE_W, + 0x1c2000 | PTE_P | PTE_W, + 0x1c3000 | PTE_P | PTE_W, + 0x1c4000 | PTE_P | PTE_W, + 0x1c5000 | PTE_P | PTE_W, + 0x1c6000 | PTE_P | PTE_W, + 0x1c7000 | PTE_P | PTE_W, + 0x1c8000 | PTE_P | PTE_W, + 0x1c9000 | PTE_P | PTE_W, + 0x1ca000 | PTE_P | PTE_W, + 0x1cb000 | PTE_P | PTE_W, + 0x1cc000 | PTE_P | PTE_W, + 0x1cd000 | PTE_P | PTE_W, + 0x1ce000 | PTE_P | PTE_W, + 0x1cf000 | PTE_P | PTE_W, + 0x1d0000 | PTE_P | PTE_W, + 0x1d1000 | PTE_P | PTE_W, + 0x1d2000 | PTE_P | PTE_W, + 0x1d3000 | PTE_P | PTE_W, + 0x1d4000 | PTE_P | PTE_W, + 0x1d5000 | PTE_P | PTE_W, + 0x1d6000 | PTE_P | PTE_W, + 0x1d7000 | PTE_P | PTE_W, + 0x1d8000 | PTE_P | PTE_W, + 0x1d9000 | PTE_P | PTE_W, + 0x1da000 | PTE_P | PTE_W, + 0x1db000 | PTE_P | PTE_W, + 0x1dc000 | PTE_P | PTE_W, + 0x1dd000 | PTE_P | PTE_W, + 0x1de000 | PTE_P | PTE_W, + 0x1df000 | PTE_P | PTE_W, + 0x1e0000 | PTE_P | PTE_W, + 0x1e1000 | PTE_P | PTE_W, + 0x1e2000 | PTE_P | PTE_W, + 0x1e3000 | PTE_P | PTE_W, + 0x1e4000 | PTE_P | PTE_W, + 0x1e5000 | PTE_P | PTE_W, + 0x1e6000 | PTE_P | PTE_W, + 0x1e7000 | PTE_P | PTE_W, + 0x1e8000 | PTE_P | PTE_W, + 0x1e9000 | PTE_P | PTE_W, + 0x1ea000 | PTE_P | PTE_W, + 0x1eb000 | PTE_P | PTE_W, + 0x1ec000 | PTE_P | PTE_W, + 0x1ed000 | PTE_P | PTE_W, + 0x1ee000 | PTE_P | PTE_W, + 0x1ef000 | PTE_P | PTE_W, + 0x1f0000 | PTE_P | PTE_W, + 0x1f1000 | PTE_P | PTE_W, + 0x1f2000 | PTE_P | PTE_W, + 0x1f3000 | PTE_P | PTE_W, + 0x1f4000 | PTE_P | PTE_W, + 0x1f5000 | PTE_P | PTE_W, + 0x1f6000 | PTE_P | PTE_W, + 0x1f7000 | PTE_P | PTE_W, + 0x1f8000 | PTE_P | PTE_W, + 0x1f9000 | PTE_P | PTE_W, + 0x1fa000 | PTE_P | PTE_W, + 0x1fb000 | PTE_P | PTE_W, + 0x1fc000 | PTE_P | PTE_W, + 0x1fd000 | PTE_P | PTE_W, + 0x1fe000 | PTE_P | PTE_W, + 0x1ff000 | PTE_P | PTE_W, + 0x200000 | PTE_P | PTE_W, + 0x201000 | PTE_P | PTE_W, + 0x202000 | PTE_P | PTE_W, + 0x203000 | PTE_P | PTE_W, + 0x204000 | PTE_P | PTE_W, + 0x205000 | PTE_P | PTE_W, + 0x206000 | PTE_P | PTE_W, + 0x207000 | PTE_P | PTE_W, + 0x208000 | PTE_P | PTE_W, + 0x209000 | PTE_P | PTE_W, + 0x20a000 | PTE_P | PTE_W, + 0x20b000 | PTE_P | PTE_W, + 0x20c000 | PTE_P | PTE_W, + 0x20d000 | PTE_P | PTE_W, + 0x20e000 | PTE_P | PTE_W, + 0x20f000 | PTE_P | PTE_W, + 0x210000 | PTE_P | PTE_W, + 0x211000 | PTE_P | PTE_W, + 0x212000 | PTE_P | PTE_W, + 0x213000 | PTE_P | PTE_W, + 0x214000 | PTE_P | PTE_W, + 0x215000 | PTE_P | PTE_W, + 0x216000 | PTE_P | PTE_W, + 0x217000 | PTE_P | PTE_W, + 0x218000 | PTE_P | PTE_W, + 0x219000 | PTE_P | PTE_W, + 0x21a000 | PTE_P | PTE_W, + 0x21b000 | PTE_P | PTE_W, + 0x21c000 | PTE_P | PTE_W, + 0x21d000 | PTE_P | PTE_W, + 0x21e000 | PTE_P | PTE_W, + 0x21f000 | PTE_P | PTE_W, + 0x220000 | PTE_P | PTE_W, + 0x221000 | PTE_P | PTE_W, + 0x222000 | PTE_P | PTE_W, + 0x223000 | PTE_P | PTE_W, + 0x224000 | PTE_P | PTE_W, + 0x225000 | PTE_P | PTE_W, + 0x226000 | PTE_P | PTE_W, + 0x227000 | PTE_P | PTE_W, + 0x228000 | PTE_P | PTE_W, + 0x229000 | PTE_P | PTE_W, + 0x22a000 | PTE_P | PTE_W, + 0x22b000 | PTE_P | PTE_W, + 0x22c000 | PTE_P | PTE_W, + 0x22d000 | PTE_P | PTE_W, + 0x22e000 | PTE_P | PTE_W, + 0x22f000 | PTE_P | PTE_W, + 0x230000 | PTE_P | PTE_W, + 0x231000 | PTE_P | PTE_W, + 0x232000 | PTE_P | PTE_W, + 0x233000 | PTE_P | PTE_W, + 0x234000 | PTE_P | PTE_W, + 0x235000 | PTE_P | PTE_W, + 0x236000 | PTE_P | PTE_W, + 0x237000 | PTE_P | PTE_W, + 0x238000 | PTE_P | PTE_W, + 0x239000 | PTE_P | PTE_W, + 0x23a000 | PTE_P | PTE_W, + 0x23b000 | PTE_P | PTE_W, + 0x23c000 | PTE_P | PTE_W, + 0x23d000 | PTE_P | PTE_W, + 0x23e000 | PTE_P | PTE_W, + 0x23f000 | PTE_P | PTE_W, + 0x240000 | PTE_P | PTE_W, + 0x241000 | PTE_P | PTE_W, + 0x242000 | PTE_P | PTE_W, + 0x243000 | PTE_P | PTE_W, + 0x244000 | PTE_P | PTE_W, + 0x245000 | PTE_P | PTE_W, + 0x246000 | PTE_P | PTE_W, + 0x247000 | PTE_P | PTE_W, + 0x248000 | PTE_P | PTE_W, + 0x249000 | PTE_P | PTE_W, + 0x24a000 | PTE_P | PTE_W, + 0x24b000 | PTE_P | PTE_W, + 0x24c000 | PTE_P | PTE_W, + 0x24d000 | PTE_P | PTE_W, + 0x24e000 | PTE_P | PTE_W, + 0x24f000 | PTE_P | PTE_W, + 0x250000 | PTE_P | PTE_W, + 0x251000 | PTE_P | PTE_W, + 0x252000 | PTE_P | PTE_W, + 0x253000 | PTE_P | PTE_W, + 0x254000 | PTE_P | PTE_W, + 0x255000 | PTE_P | PTE_W, + 0x256000 | PTE_P | PTE_W, + 0x257000 | PTE_P | PTE_W, + 0x258000 | PTE_P | PTE_W, + 0x259000 | PTE_P | PTE_W, + 0x25a000 | PTE_P | PTE_W, + 0x25b000 | PTE_P | PTE_W, + 0x25c000 | PTE_P | PTE_W, + 0x25d000 | PTE_P | PTE_W, + 0x25e000 | PTE_P | PTE_W, + 0x25f000 | PTE_P | PTE_W, + 0x260000 | PTE_P | PTE_W, + 0x261000 | PTE_P | PTE_W, + 0x262000 | PTE_P | PTE_W, + 0x263000 | PTE_P | PTE_W, + 0x264000 | PTE_P | PTE_W, + 0x265000 | PTE_P | PTE_W, + 0x266000 | PTE_P | PTE_W, + 0x267000 | PTE_P | PTE_W, + 0x268000 | PTE_P | PTE_W, + 0x269000 | PTE_P | PTE_W, + 0x26a000 | PTE_P | PTE_W, + 0x26b000 | PTE_P | PTE_W, + 0x26c000 | PTE_P | PTE_W, + 0x26d000 | PTE_P | PTE_W, + 0x26e000 | PTE_P | PTE_W, + 0x26f000 | PTE_P | PTE_W, + 0x270000 | PTE_P | PTE_W, + 0x271000 | PTE_P | PTE_W, + 0x272000 | PTE_P | PTE_W, + 0x273000 | PTE_P | PTE_W, + 0x274000 | PTE_P | PTE_W, + 0x275000 | PTE_P | PTE_W, + 0x276000 | PTE_P | PTE_W, + 0x277000 | PTE_P | PTE_W, + 0x278000 | PTE_P | PTE_W, + 0x279000 | PTE_P | PTE_W, + 0x27a000 | PTE_P | PTE_W, + 0x27b000 | PTE_P | PTE_W, + 0x27c000 | PTE_P | PTE_W, + 0x27d000 | PTE_P | PTE_W, + 0x27e000 | PTE_P | PTE_W, + 0x27f000 | PTE_P | PTE_W, + 0x280000 | PTE_P | PTE_W, + 0x281000 | PTE_P | PTE_W, + 0x282000 | PTE_P | PTE_W, + 0x283000 | PTE_P | PTE_W, + 0x284000 | PTE_P | PTE_W, + 0x285000 | PTE_P | PTE_W, + 0x286000 | PTE_P | PTE_W, + 0x287000 | PTE_P | PTE_W, + 0x288000 | PTE_P | PTE_W, + 0x289000 | PTE_P | PTE_W, + 0x28a000 | PTE_P | PTE_W, + 0x28b000 | PTE_P | PTE_W, + 0x28c000 | PTE_P | PTE_W, + 0x28d000 | PTE_P | PTE_W, + 0x28e000 | PTE_P | PTE_W, + 0x28f000 | PTE_P | PTE_W, + 0x290000 | PTE_P | PTE_W, + 0x291000 | PTE_P | PTE_W, + 0x292000 | PTE_P | PTE_W, + 0x293000 | PTE_P | PTE_W, + 0x294000 | PTE_P | PTE_W, + 0x295000 | PTE_P | PTE_W, + 0x296000 | PTE_P | PTE_W, + 0x297000 | PTE_P | PTE_W, + 0x298000 | PTE_P | PTE_W, + 0x299000 | PTE_P | PTE_W, + 0x29a000 | PTE_P | PTE_W, + 0x29b000 | PTE_P | PTE_W, + 0x29c000 | PTE_P | PTE_W, + 0x29d000 | PTE_P | PTE_W, + 0x29e000 | PTE_P | PTE_W, + 0x29f000 | PTE_P | PTE_W, + 0x2a0000 | PTE_P | PTE_W, + 0x2a1000 | PTE_P | PTE_W, + 0x2a2000 | PTE_P | PTE_W, + 0x2a3000 | PTE_P | PTE_W, + 0x2a4000 | PTE_P | PTE_W, + 0x2a5000 | PTE_P | PTE_W, + 0x2a6000 | PTE_P | PTE_W, + 0x2a7000 | PTE_P | PTE_W, + 0x2a8000 | PTE_P | PTE_W, + 0x2a9000 | PTE_P | PTE_W, + 0x2aa000 | PTE_P | PTE_W, + 0x2ab000 | PTE_P | PTE_W, + 0x2ac000 | PTE_P | PTE_W, + 0x2ad000 | PTE_P | PTE_W, + 0x2ae000 | PTE_P | PTE_W, + 0x2af000 | PTE_P | PTE_W, + 0x2b0000 | PTE_P | PTE_W, + 0x2b1000 | PTE_P | PTE_W, + 0x2b2000 | PTE_P | PTE_W, + 0x2b3000 | PTE_P | PTE_W, + 0x2b4000 | PTE_P | PTE_W, + 0x2b5000 | PTE_P | PTE_W, + 0x2b6000 | PTE_P | PTE_W, + 0x2b7000 | PTE_P | PTE_W, + 0x2b8000 | PTE_P | PTE_W, + 0x2b9000 | PTE_P | PTE_W, + 0x2ba000 | PTE_P | PTE_W, + 0x2bb000 | PTE_P | PTE_W, + 0x2bc000 | PTE_P | PTE_W, + 0x2bd000 | PTE_P | PTE_W, + 0x2be000 | PTE_P | PTE_W, + 0x2bf000 | PTE_P | PTE_W, + 0x2c0000 | PTE_P | PTE_W, + 0x2c1000 | PTE_P | PTE_W, + 0x2c2000 | PTE_P | PTE_W, + 0x2c3000 | PTE_P | PTE_W, + 0x2c4000 | PTE_P | PTE_W, + 0x2c5000 | PTE_P | PTE_W, + 0x2c6000 | PTE_P | PTE_W, + 0x2c7000 | PTE_P | PTE_W, + 0x2c8000 | PTE_P | PTE_W, + 0x2c9000 | PTE_P | PTE_W, + 0x2ca000 | PTE_P | PTE_W, + 0x2cb000 | PTE_P | PTE_W, + 0x2cc000 | PTE_P | PTE_W, + 0x2cd000 | PTE_P | PTE_W, + 0x2ce000 | PTE_P | PTE_W, + 0x2cf000 | PTE_P | PTE_W, + 0x2d0000 | PTE_P | PTE_W, + 0x2d1000 | PTE_P | PTE_W, + 0x2d2000 | PTE_P | PTE_W, + 0x2d3000 | PTE_P | PTE_W, + 0x2d4000 | PTE_P | PTE_W, + 0x2d5000 | PTE_P | PTE_W, + 0x2d6000 | PTE_P | PTE_W, + 0x2d7000 | PTE_P | PTE_W, + 0x2d8000 | PTE_P | PTE_W, + 0x2d9000 | PTE_P | PTE_W, + 0x2da000 | PTE_P | PTE_W, + 0x2db000 | PTE_P | PTE_W, + 0x2dc000 | PTE_P | PTE_W, + 0x2dd000 | PTE_P | PTE_W, + 0x2de000 | PTE_P | PTE_W, + 0x2df000 | PTE_P | PTE_W, + 0x2e0000 | PTE_P | PTE_W, + 0x2e1000 | PTE_P | PTE_W, + 0x2e2000 | PTE_P | PTE_W, + 0x2e3000 | PTE_P | PTE_W, + 0x2e4000 | PTE_P | PTE_W, + 0x2e5000 | PTE_P | PTE_W, + 0x2e6000 | PTE_P | PTE_W, + 0x2e7000 | PTE_P | PTE_W, + 0x2e8000 | PTE_P | PTE_W, + 0x2e9000 | PTE_P | PTE_W, + 0x2ea000 | PTE_P | PTE_W, + 0x2eb000 | PTE_P | PTE_W, + 0x2ec000 | PTE_P | PTE_W, + 0x2ed000 | PTE_P | PTE_W, + 0x2ee000 | PTE_P | PTE_W, + 0x2ef000 | PTE_P | PTE_W, + 0x2f0000 | PTE_P | PTE_W, + 0x2f1000 | PTE_P | PTE_W, + 0x2f2000 | PTE_P | PTE_W, + 0x2f3000 | PTE_P | PTE_W, + 0x2f4000 | PTE_P | PTE_W, + 0x2f5000 | PTE_P | PTE_W, + 0x2f6000 | PTE_P | PTE_W, + 0x2f7000 | PTE_P | PTE_W, + 0x2f8000 | PTE_P | PTE_W, + 0x2f9000 | PTE_P | PTE_W, + 0x2fa000 | PTE_P | PTE_W, + 0x2fb000 | PTE_P | PTE_W, + 0x2fc000 | PTE_P | PTE_W, + 0x2fd000 | PTE_P | PTE_W, + 0x2fe000 | PTE_P | PTE_W, + 0x2ff000 | PTE_P | PTE_W, + 0x300000 | PTE_P | PTE_W, + 0x301000 | PTE_P | PTE_W, + 0x302000 | PTE_P | PTE_W, + 0x303000 | PTE_P | PTE_W, + 0x304000 | PTE_P | PTE_W, + 0x305000 | PTE_P | PTE_W, + 0x306000 | PTE_P | PTE_W, + 0x307000 | PTE_P | PTE_W, + 0x308000 | PTE_P | PTE_W, + 0x309000 | PTE_P | PTE_W, + 0x30a000 | PTE_P | PTE_W, + 0x30b000 | PTE_P | PTE_W, + 0x30c000 | PTE_P | PTE_W, + 0x30d000 | PTE_P | PTE_W, + 0x30e000 | PTE_P | PTE_W, + 0x30f000 | PTE_P | PTE_W, + 0x310000 | PTE_P | PTE_W, + 0x311000 | PTE_P | PTE_W, + 0x312000 | PTE_P | PTE_W, + 0x313000 | PTE_P | PTE_W, + 0x314000 | PTE_P | PTE_W, + 0x315000 | PTE_P | PTE_W, + 0x316000 | PTE_P | PTE_W, + 0x317000 | PTE_P | PTE_W, + 0x318000 | PTE_P | PTE_W, + 0x319000 | PTE_P | PTE_W, + 0x31a000 | PTE_P | PTE_W, + 0x31b000 | PTE_P | PTE_W, + 0x31c000 | PTE_P | PTE_W, + 0x31d000 | PTE_P | PTE_W, + 0x31e000 | PTE_P | PTE_W, + 0x31f000 | PTE_P | PTE_W, + 0x320000 | PTE_P | PTE_W, + 0x321000 | PTE_P | PTE_W, + 0x322000 | PTE_P | PTE_W, + 0x323000 | PTE_P | PTE_W, + 0x324000 | PTE_P | PTE_W, + 0x325000 | PTE_P | PTE_W, + 0x326000 | PTE_P | PTE_W, + 0x327000 | PTE_P | PTE_W, + 0x328000 | PTE_P | PTE_W, + 0x329000 | PTE_P | PTE_W, + 0x32a000 | PTE_P | PTE_W, + 0x32b000 | PTE_P | PTE_W, + 0x32c000 | PTE_P | PTE_W, + 0x32d000 | PTE_P | PTE_W, + 0x32e000 | PTE_P | PTE_W, + 0x32f000 | PTE_P | PTE_W, + 0x330000 | PTE_P | PTE_W, + 0x331000 | PTE_P | PTE_W, + 0x332000 | PTE_P | PTE_W, + 0x333000 | PTE_P | PTE_W, + 0x334000 | PTE_P | PTE_W, + 0x335000 | PTE_P | PTE_W, + 0x336000 | PTE_P | PTE_W, + 0x337000 | PTE_P | PTE_W, + 0x338000 | PTE_P | PTE_W, + 0x339000 | PTE_P | PTE_W, + 0x33a000 | PTE_P | PTE_W, + 0x33b000 | PTE_P | PTE_W, + 0x33c000 | PTE_P | PTE_W, + 0x33d000 | PTE_P | PTE_W, + 0x33e000 | PTE_P | PTE_W, + 0x33f000 | PTE_P | PTE_W, + 0x340000 | PTE_P | PTE_W, + 0x341000 | PTE_P | PTE_W, + 0x342000 | PTE_P | PTE_W, + 0x343000 | PTE_P | PTE_W, + 0x344000 | PTE_P | PTE_W, + 0x345000 | PTE_P | PTE_W, + 0x346000 | PTE_P | PTE_W, + 0x347000 | PTE_P | PTE_W, + 0x348000 | PTE_P | PTE_W, + 0x349000 | PTE_P | PTE_W, + 0x34a000 | PTE_P | PTE_W, + 0x34b000 | PTE_P | PTE_W, + 0x34c000 | PTE_P | PTE_W, + 0x34d000 | PTE_P | PTE_W, + 0x34e000 | PTE_P | PTE_W, + 0x34f000 | PTE_P | PTE_W, + 0x350000 | PTE_P | PTE_W, + 0x351000 | PTE_P | PTE_W, + 0x352000 | PTE_P | PTE_W, + 0x353000 | PTE_P | PTE_W, + 0x354000 | PTE_P | PTE_W, + 0x355000 | PTE_P | PTE_W, + 0x356000 | PTE_P | PTE_W, + 0x357000 | PTE_P | PTE_W, + 0x358000 | PTE_P | PTE_W, + 0x359000 | PTE_P | PTE_W, + 0x35a000 | PTE_P | PTE_W, + 0x35b000 | PTE_P | PTE_W, + 0x35c000 | PTE_P | PTE_W, + 0x35d000 | PTE_P | PTE_W, + 0x35e000 | PTE_P | PTE_W, + 0x35f000 | PTE_P | PTE_W, + 0x360000 | PTE_P | PTE_W, + 0x361000 | PTE_P | PTE_W, + 0x362000 | PTE_P | PTE_W, + 0x363000 | PTE_P | PTE_W, + 0x364000 | PTE_P | PTE_W, + 0x365000 | PTE_P | PTE_W, + 0x366000 | PTE_P | PTE_W, + 0x367000 | PTE_P | PTE_W, + 0x368000 | PTE_P | PTE_W, + 0x369000 | PTE_P | PTE_W, + 0x36a000 | PTE_P | PTE_W, + 0x36b000 | PTE_P | PTE_W, + 0x36c000 | PTE_P | PTE_W, + 0x36d000 | PTE_P | PTE_W, + 0x36e000 | PTE_P | PTE_W, + 0x36f000 | PTE_P | PTE_W, + 0x370000 | PTE_P | PTE_W, + 0x371000 | PTE_P | PTE_W, + 0x372000 | PTE_P | PTE_W, + 0x373000 | PTE_P | PTE_W, + 0x374000 | PTE_P | PTE_W, + 0x375000 | PTE_P | PTE_W, + 0x376000 | PTE_P | PTE_W, + 0x377000 | PTE_P | PTE_W, + 0x378000 | PTE_P | PTE_W, + 0x379000 | PTE_P | PTE_W, + 0x37a000 | PTE_P | PTE_W, + 0x37b000 | PTE_P | PTE_W, + 0x37c000 | PTE_P | PTE_W, + 0x37d000 | PTE_P | PTE_W, + 0x37e000 | PTE_P | PTE_W, + 0x37f000 | PTE_P | PTE_W, + 0x380000 | PTE_P | PTE_W, + 0x381000 | PTE_P | PTE_W, + 0x382000 | PTE_P | PTE_W, + 0x383000 | PTE_P | PTE_W, + 0x384000 | PTE_P | PTE_W, + 0x385000 | PTE_P | PTE_W, + 0x386000 | PTE_P | PTE_W, + 0x387000 | PTE_P | PTE_W, + 0x388000 | PTE_P | PTE_W, + 0x389000 | PTE_P | PTE_W, + 0x38a000 | PTE_P | PTE_W, + 0x38b000 | PTE_P | PTE_W, + 0x38c000 | PTE_P | PTE_W, + 0x38d000 | PTE_P | PTE_W, + 0x38e000 | PTE_P | PTE_W, + 0x38f000 | PTE_P | PTE_W, + 0x390000 | PTE_P | PTE_W, + 0x391000 | PTE_P | PTE_W, + 0x392000 | PTE_P | PTE_W, + 0x393000 | PTE_P | PTE_W, + 0x394000 | PTE_P | PTE_W, + 0x395000 | PTE_P | PTE_W, + 0x396000 | PTE_P | PTE_W, + 0x397000 | PTE_P | PTE_W, + 0x398000 | PTE_P | PTE_W, + 0x399000 | PTE_P | PTE_W, + 0x39a000 | PTE_P | PTE_W, + 0x39b000 | PTE_P | PTE_W, + 0x39c000 | PTE_P | PTE_W, + 0x39d000 | PTE_P | PTE_W, + 0x39e000 | PTE_P | PTE_W, + 0x39f000 | PTE_P | PTE_W, + 0x3a0000 | PTE_P | PTE_W, + 0x3a1000 | PTE_P | PTE_W, + 0x3a2000 | PTE_P | PTE_W, + 0x3a3000 | PTE_P | PTE_W, + 0x3a4000 | PTE_P | PTE_W, + 0x3a5000 | PTE_P | PTE_W, + 0x3a6000 | PTE_P | PTE_W, + 0x3a7000 | PTE_P | PTE_W, + 0x3a8000 | PTE_P | PTE_W, + 0x3a9000 | PTE_P | PTE_W, + 0x3aa000 | PTE_P | PTE_W, + 0x3ab000 | PTE_P | PTE_W, + 0x3ac000 | PTE_P | PTE_W, + 0x3ad000 | PTE_P | PTE_W, + 0x3ae000 | PTE_P | PTE_W, + 0x3af000 | PTE_P | PTE_W, + 0x3b0000 | PTE_P | PTE_W, + 0x3b1000 | PTE_P | PTE_W, + 0x3b2000 | PTE_P | PTE_W, + 0x3b3000 | PTE_P | PTE_W, + 0x3b4000 | PTE_P | PTE_W, + 0x3b5000 | PTE_P | PTE_W, + 0x3b6000 | PTE_P | PTE_W, + 0x3b7000 | PTE_P | PTE_W, + 0x3b8000 | PTE_P | PTE_W, + 0x3b9000 | PTE_P | PTE_W, + 0x3ba000 | PTE_P | PTE_W, + 0x3bb000 | PTE_P | PTE_W, + 0x3bc000 | PTE_P | PTE_W, + 0x3bd000 | PTE_P | PTE_W, + 0x3be000 | PTE_P | PTE_W, + 0x3bf000 | PTE_P | PTE_W, + 0x3c0000 | PTE_P | PTE_W, + 0x3c1000 | PTE_P | PTE_W, + 0x3c2000 | PTE_P | PTE_W, + 0x3c3000 | PTE_P | PTE_W, + 0x3c4000 | PTE_P | PTE_W, + 0x3c5000 | PTE_P | PTE_W, + 0x3c6000 | PTE_P | PTE_W, + 0x3c7000 | PTE_P | PTE_W, + 0x3c8000 | PTE_P | PTE_W, + 0x3c9000 | PTE_P | PTE_W, + 0x3ca000 | PTE_P | PTE_W, + 0x3cb000 | PTE_P | PTE_W, + 0x3cc000 | PTE_P | PTE_W, + 0x3cd000 | PTE_P | PTE_W, + 0x3ce000 | PTE_P | PTE_W, + 0x3cf000 | PTE_P | PTE_W, + 0x3d0000 | PTE_P | PTE_W, + 0x3d1000 | PTE_P | PTE_W, + 0x3d2000 | PTE_P | PTE_W, + 0x3d3000 | PTE_P | PTE_W, + 0x3d4000 | PTE_P | PTE_W, + 0x3d5000 | PTE_P | PTE_W, + 0x3d6000 | PTE_P | PTE_W, + 0x3d7000 | PTE_P | PTE_W, + 0x3d8000 | PTE_P | PTE_W, + 0x3d9000 | PTE_P | PTE_W, + 0x3da000 | PTE_P | PTE_W, + 0x3db000 | PTE_P | PTE_W, + 0x3dc000 | PTE_P | PTE_W, + 0x3dd000 | PTE_P | PTE_W, + 0x3de000 | PTE_P | PTE_W, + 0x3df000 | PTE_P | PTE_W, + 0x3e0000 | PTE_P | PTE_W, + 0x3e1000 | PTE_P | PTE_W, + 0x3e2000 | PTE_P | PTE_W, + 0x3e3000 | PTE_P | PTE_W, + 0x3e4000 | PTE_P | PTE_W, + 0x3e5000 | PTE_P | PTE_W, + 0x3e6000 | PTE_P | PTE_W, + 0x3e7000 | PTE_P | PTE_W, + 0x3e8000 | PTE_P | PTE_W, + 0x3e9000 | PTE_P | PTE_W, + 0x3ea000 | PTE_P | PTE_W, + 0x3eb000 | PTE_P | PTE_W, + 0x3ec000 | PTE_P | PTE_W, + 0x3ed000 | PTE_P | PTE_W, + 0x3ee000 | PTE_P | PTE_W, + 0x3ef000 | PTE_P | PTE_W, + 0x3f0000 | PTE_P | PTE_W, + 0x3f1000 | PTE_P | PTE_W, + 0x3f2000 | PTE_P | PTE_W, + 0x3f3000 | PTE_P | PTE_W, + 0x3f4000 | PTE_P | PTE_W, + 0x3f5000 | PTE_P | PTE_W, + 0x3f6000 | PTE_P | PTE_W, + 0x3f7000 | PTE_P | PTE_W, + 0x3f8000 | PTE_P | PTE_W, + 0x3f9000 | PTE_P | PTE_W, + 0x3fa000 | PTE_P | PTE_W, + 0x3fb000 | PTE_P | PTE_W, + 0x3fc000 | PTE_P | PTE_W, + 0x3fd000 | PTE_P | PTE_W, + 0x3fe000 | PTE_P | PTE_W, + 0x3ff000 | PTE_P | PTE_W, +}; + //PAGEBREAK! // Blank page. diff --git a/memlayout.h b/memlayout.h index 6c44db2..1496678 100644 --- a/memlayout.h +++ b/memlayout.h @@ -5,8 +5,7 @@ #define KSTKSIZE (8*PGSIZE) // size of a kernel stack -#define IOSPACEB 0x0A0000 // begin IO space -#define IOSPACEE 0x100000 // end IO space +#define DEVSPACE 0xFE000000 // other devices are in the top of the phys address space #define PHYSTOP 0xE000000 // use phys mem up to here as free pool // Key addresses for address space layout (see kmap in vm.c for the layout) diff --git a/multiboot.S b/multiboot.S index 4aa9f20..84f4aa0 100644 --- a/multiboot.S +++ b/multiboot.S @@ -41,8 +41,8 @@ multiboot_header: # boot loader - bootasm.S - sets up. .globl multiboot_entry multiboot_entry: - lgdt V2P_WO(gdtdesc) - ljmp $(SEG_KCODE<<3), $mbstart32 +# lgdt V2P_WO(gdtdesc) +# ljmp $(SEG_KCODE<<3), $mbstart32 mbstart32: # Set up the protected-mode data segment registers @@ -54,21 +54,22 @@ mbstart32: movw %ax, %fs # -> FS movw %ax, %gs # -> GS + movl $(V2P_WO(bootpgdir)), %eax + movl %eax, %cr3 + # Turn on paging. + movl %cr0, %eax + orl $(CR0_PE|CR0_PG|CR0_WP), %eax + movl %eax, %cr0 + + # now switch to using addresses above KERNBASE + # call addresses are pc-relative so we jump though this hoop: + mov $relocated, %eax + jmp *%eax +relocated: # Set up the stack pointer and call into C. movl $(stack + STACK), %esp call main spin: jmp spin -# Bootstrap GDT -.p2align 2 # force 4 byte alignment -gdt: - SEG_NULLASM # null seg - SEG_ASM(STA_X|STA_R, -KERNBASE, 0xffffffff) # code seg - SEG_ASM(STA_W, -KERNBASE, 0xffffffff) # data seg - -gdtdesc: - .word (gdtdesc - gdt - 1) # sizeof(gdt) - 1 - .long V2P_WO(gdt) # address gdt - .comm stack, STACK diff --git a/proc.c b/proc.c index 626d03e..96a9c8e 100644 --- a/proc.c +++ b/proc.c @@ -83,7 +83,7 @@ userinit(void) p = allocproc(); initproc = p; - if((p->pgdir = setupkvm()) == 0) + if((p->pgdir = setupkvm(kalloc)) == 0) panic("userinit: out of memory?"); inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); p->sz = PGSIZE; diff --git a/vm.c b/vm.c index 2ca2a98..2362453 100644 --- a/vm.c +++ b/vm.c @@ -11,64 +11,6 @@ extern char data[]; // defined in data.S static pde_t *kpgdir; // for use in scheduler() struct segdesc gdt[NSEGS]; - -// page map for during boot -// XXX build a static page table in assembly -static void -pgmap(void *va, void *last, uint pa) -{ - pde_t *pde; - pte_t *pgtab; - pte_t *pte; - - for(;;){ - pde = &kpgdir[PDX(va)]; - pde_t pdev = *pde; - if (pdev == 0) { - pgtab = (pte_t *) pgalloc(); - *pde = v2p(pgtab) | PTE_P | PTE_W; - } else { - pgtab = (pte_t*)p2v(PTE_ADDR(pdev)); - } - pte = &pgtab[PTX(va)]; - *pte = pa | PTE_W | PTE_P; - if(va == last) - break; - va += PGSIZE; - pa += PGSIZE; - } -} - -// set up a page table to get off the ground -void -pginit(char* (*alloc)(void)) -{ - uint cr0; - - kpgdir = (pde_t *) alloc(); - pgmap((void *) 0, (void *) PHYSTOP, 0); // map pa 0 at va 0 - pgmap((void *) KERNBASE, (void *) (KERNBASE+PHYSTOP), 0); // map pa 0 at va KERNBASE - pgmap((void*)0xFE000000, 0, 0xFE000000); - - switchkvm(); // load kpgdir into cr3 - - cr0 = rcr0(); - cr0 |= CR0_PG; - lcr0(cr0); // paging on - - // new gdt - gdt[SEG_KCODE] = SEG(STA_X|STA_R, 0, 0xffffffff, 0); - gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0); - lgdt((void *)v2p(gdt), sizeof(gdt)); - loadgs(SEG_KDATA << 3); - loadfs(SEG_KDATA << 3); - loades(SEG_KDATA << 3); - loadds(SEG_KDATA << 3); - loadss(SEG_KDATA << 3); - - __asm volatile("ljmp %0,$1f\n 1:\n" :: "i" (SEG_KCODE << 3)); // reload cs -} - // Set up CPU's kernel segment descriptors. // Run once at boot time on each CPU. void @@ -101,7 +43,7 @@ seginit(void) // that corresponds to linear address va. If create!=0, // create any required page table pages. static pte_t * -walkpgdir(pde_t *pgdir, const void *va, int create) +walkpgdir(pde_t *pgdir, const void *va, int create, char* (*alloc)(void)) { pde_t *pde; pte_t *pgtab; @@ -110,7 +52,7 @@ walkpgdir(pde_t *pgdir, const void *va, int create) if(*pde & PTE_P){ pgtab = (pte_t*)p2v(PTE_ADDR(*pde)); } else { - if(!create || (pgtab = (pte_t*)kalloc()) == 0) + if(!create || (pgtab = (pte_t*)alloc()) == 0) return 0; // Make sure all those PTE_P bits are zero. memset(pgtab, 0, PGSIZE); @@ -126,7 +68,7 @@ walkpgdir(pde_t *pgdir, const void *va, int create) // 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) +mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm, char* (*alloc)(void)) { char *a, *last; pte_t *pte; @@ -134,7 +76,7 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm) a = PGROUNDDOWN(la); last = PGROUNDDOWN(la + size - 1); for(;;){ - pte = walkpgdir(pgdir, a, 1); + pte = walkpgdir(pgdir, a, 1, alloc); if(pte == 0) return -1; if(*pte & PTE_P) @@ -175,25 +117,25 @@ static struct kmap { uint e; int perm; } kmap[] = { - { P2V(IOSPACEB), IOSPACEB, IOSPACEE, PTE_W}, // I/O space + { P2V(0), 0, 1024*1024, PTE_W}, // First 1Mbyte contains BIOS and IO section { (void *)KERNLINK, V2P(KERNLINK), V2P(data), 0}, // kernel text, rodata { data, V2P(data), PHYSTOP, PTE_W}, // kernel data, memory - { (void*)0xFE000000, 0xFE000000, 0, PTE_W}, // device mappings + { (void*)DEVSPACE, DEVSPACE, 0, PTE_W}, // device mappings }; // Set up kernel part of a page table. pde_t* -setupkvm(void) +setupkvm(char* (*alloc)(void)) { pde_t *pgdir; struct kmap *k; - if((pgdir = (pde_t*)kalloc()) == 0) + if((pgdir = (pde_t*)alloc()) == 0) return 0; 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) < 0) + if(mappages(pgdir, k->l, k->e - k->p, (uint)k->p, k->perm, alloc) < 0) return 0; return pgdir; @@ -204,7 +146,7 @@ setupkvm(void) void kvmalloc(void) { - kpgdir = setupkvm(); + kpgdir = setupkvm(boot_alloc); switchkvm(); } @@ -265,7 +207,7 @@ inituvm(pde_t *pgdir, char *init, uint sz) panic("inituvm: more than a page"); mem = kalloc(); memset(mem, 0, PGSIZE); - mappages(pgdir, 0, PGSIZE, v2p(mem), PTE_W|PTE_U); + mappages(pgdir, 0, PGSIZE, v2p(mem), PTE_W|PTE_U, kalloc); memmove(mem, init, sz); } @@ -280,7 +222,7 @@ loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) if((uint)addr % PGSIZE != 0) panic("loaduvm: addr must be page aligned"); for(i = 0; i < sz; i += PGSIZE){ - if((pte = walkpgdir(pgdir, addr+i, 0)) == 0) + if((pte = walkpgdir(pgdir, addr+i, 0, kalloc)) == 0) panic("loaduvm: address should exist"); pa = PTE_ADDR(*pte); if(sz - i < PGSIZE) @@ -315,7 +257,7 @@ allocuvm(pde_t *pgdir, uint oldsz, uint newsz) return 0; } memset(mem, 0, PGSIZE); - mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U); + mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U, kalloc); } return newsz; } @@ -335,7 +277,7 @@ deallocuvm(pde_t *pgdir, uint oldsz, uint newsz) a = PGROUNDUP(newsz); for(; a < oldsz; a += PGSIZE){ - pte = walkpgdir(pgdir, (char*)a, 0); + pte = walkpgdir(pgdir, (char*)a, 0, kalloc); if(pte && (*pte & PTE_P) != 0){ pa = PTE_ADDR(*pte); if(pa == 0) @@ -377,10 +319,10 @@ copyuvm(pde_t *pgdir, uint sz) uint pa, i; char *mem; - if((d = setupkvm()) == 0) + if((d = setupkvm(kalloc)) == 0) return 0; for(i = 0; i < sz; i += PGSIZE){ - if((pte = walkpgdir(pgdir, (void*)i, 0)) == 0) + if((pte = walkpgdir(pgdir, (void*)i, 0, kalloc)) == 0) panic("copyuvm: pte should exist"); if(!(*pte & PTE_P)) panic("copyuvm: page not present"); @@ -388,7 +330,7 @@ copyuvm(pde_t *pgdir, uint sz) if((mem = kalloc()) == 0) goto bad; 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, kalloc) < 0) goto bad; } return d; @@ -405,7 +347,7 @@ uva2ka(pde_t *pgdir, char *uva) { pte_t *pte; - pte = walkpgdir(pgdir, uva, 0); + pte = walkpgdir(pgdir, uva, 0, kalloc); if((*pte & PTE_P) == 0) return 0; if((*pte & PTE_U) == 0)