summaryrefslogtreecommitdiff
path: root/kernel/proc.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2020-10-14 20:03:14 -0400
committerFrans Kaashoek <[email protected]>2020-10-14 20:28:16 -0400
commitd4cecb269f2acc61cc1adc11fec2aa690b9c553b (patch)
tree810d6d0ab6ee7c31b42d0635e7f91ba5722cab92 /kernel/proc.c
parent21cfc978096c3ffa2fdd3bde4e698482a5dff6c3 (diff)
downloadxv6-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/proc.c')
-rw-r--r--kernel/proc.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/kernel/proc.c b/kernel/proc.c
index 56314e5..d847c43 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -21,6 +21,23 @@ static void freeproc(struct proc *p);
extern char trampoline[]; // trampoline.S
+
+// Allocate a page for each process's kernel stack.
+// Map it high in memory, followed by an invalid
+// guard page.
+void
+proc_mapstacks(pagetable_t kpgtbl) {
+ struct proc *p;
+
+ for(p = proc; p < &proc[NPROC]; p++) {
+ char *pa = kalloc();
+ if(pa == 0)
+ panic("kalloc");
+ uint64 va = KSTACK((int) (p - proc));
+ kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W);
+ }
+}
+
// initialize the proc table at boot time.
void
procinit(void)
@@ -30,18 +47,8 @@ procinit(void)
initlock(&pid_lock, "nextpid");
for(p = proc; p < &proc[NPROC]; p++) {
initlock(&p->lock, "proc");
-
- // Allocate a page for the process's kernel stack.
- // Map it high in memory, followed by an invalid
- // guard page.
- char *pa = kalloc();
- if(pa == 0)
- panic("kalloc");
- uint64 va = KSTACK((int) (p - proc));
- kvmmap(va, (uint64)pa, PGSIZE, PTE_R | PTE_W);
- p->kstack = va;
+ p->kstack = KSTACK((int) (p - proc));
}
- kvminithart();
}
// Must be called with interrupts disabled,