diff options
author | Frans Kaashoek <[email protected]> | 2020-10-14 20:03:14 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2020-10-14 20:28:16 -0400 |
commit | d4cecb269f2acc61cc1adc11fec2aa690b9c553b (patch) | |
tree | 810d6d0ab6ee7c31b42d0635e7f91ba5722cab92 /kernel/vm.c | |
parent | 21cfc978096c3ffa2fdd3bde4e698482a5dff6c3 (diff) | |
download | xv6-labs-d4cecb269f2acc61cc1adc11fec2aa690b9c553b.tar.gz xv6-labs-d4cecb269f2acc61cc1adc11fec2aa690b9c553b.tar.bz2 xv6-labs-d4cecb269f2acc61cc1adc11fec2aa690b9c553b.zip |
kvmmake() makes a complete kernel page table, matching Figure 3.3
Diffstat (limited to 'kernel/vm.c')
-rw-r--r-- | kernel/vm.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/kernel/vm.c b/kernel/vm.c index bd53fd7..b47f111 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -15,33 +15,45 @@ extern char etext[]; // kernel.ld sets this to end of kernel code. extern char trampoline[]; // trampoline.S -/* - * create a direct-map page table for the kernel. - */ -void -kvminit() +// Make a direct-map page table for the kernel. +pagetable_t +kvmmake(void) { - kernel_pagetable = (pagetable_t) kalloc(); - memset(kernel_pagetable, 0, PGSIZE); + pagetable_t kpgtbl; + + kpgtbl = (pagetable_t) kalloc(); + memset(kpgtbl, 0, PGSIZE); // uart registers - kvmmap(UART0, UART0, PGSIZE, PTE_R | PTE_W); + kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W); // virtio mmio disk interface - kvmmap(VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); + kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); // PLIC - kvmmap(PLIC, PLIC, 0x400000, PTE_R | PTE_W); + kvmmap(kpgtbl, PLIC, PLIC, 0x400000, PTE_R | PTE_W); // map kernel text executable and read-only. - kvmmap(KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); + kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); // map kernel data and the physical RAM we'll make use of. - kvmmap((uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); + kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); // map the trampoline for trap entry/exit to // the highest virtual address in the kernel. - kvmmap(TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + + // map kernel stacks + proc_mapstacks(kpgtbl); + + return kpgtbl; +} + +// Initialize the one kernel_pagetable +void +kvminit(void) +{ + kernel_pagetable = kvmmake(); } // Switch h/w page table register to the kernel's page table, @@ -112,9 +124,9 @@ walkaddr(pagetable_t pagetable, uint64 va) // only used when booting. // does not flush TLB or enable paging. void -kvmmap(uint64 va, uint64 pa, uint64 sz, int perm) +kvmmap(pagetable_t kpgtbl, uint64 va, uint64 pa, uint64 sz, int perm) { - if(mappages(kernel_pagetable, va, sz, pa, perm) != 0) + if(mappages(kpgtbl, va, sz, pa, perm) != 0) panic("kvmmap"); } |