From 91566327012cad2ca99df47f9321dfc012d8a7ff Mon Sep 17 00:00:00 2001 From: Frans Kaashoek Date: Fri, 19 Jul 2019 08:38:51 -0400 Subject: One way of supporting a guard page below kstack: allocate kstacks in procinit() and map them high up (below TRAMPOLNE) with an empty mapping below each stack. Never free a kernel stack. Another way would be to allocate and map them dynamically, but then we need to reload page table when switching processes in scheduler() and/or have a kernel pagetable per proc (if we want k->stack to be the same virtual address in each process). One gotcha: kernel addresses are not equal to physical addresses for stack addresses. A stack address must be translated if we need its physical address (e.g., virtio passes a stack address to the disk). --- kernel/memlayout.h | 1 + 1 file changed, 1 insertion(+) (limited to 'kernel/memlayout.h') diff --git a/kernel/memlayout.h b/kernel/memlayout.h index 219c308..13d1705 100644 --- a/kernel/memlayout.h +++ b/kernel/memlayout.h @@ -53,3 +53,4 @@ // map the trampoline page to the highest address, // in both user and kernel space. #define TRAMPOLINE (MAXVA - PGSIZE) +#define KSTACK(p) ((TRAMPOLINE-PGSIZE)-p*2*PGSIZE) -- cgit v1.2.3