📄 memlayout.h
字号:
#ifndef JOS_INC_MEMLAYOUT_H#define JOS_INC_MEMLAYOUT_H#ifndef __ASSEMBLER__#include <inc/types.h>#include <inc/queue.h>#include <inc/mmu.h>#endif /* not __ASSEMBLER__ *//* * This file contains definitions for memory management in our OS, * which are relevant to both the kernel and user-mode software. */// Global descriptor numbers#define GD_KT 0x08 // kernel text#define GD_KD 0x10 // kernel data#define GD_UT 0x18 // user text#define GD_UD 0x20 // user data#define GD_TSS 0x28 // Task segment selector/* * Virtual memory map: Permissions * kernel/user * * 4 Gig --------> +------------------------------+ * | | RW/-- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * : . : * : . : * : . : * |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| RW/-- * | | RW/-- * | Remapped Physical Memory | RW/-- * | | RW/-- * KERNBASE -----> +------------------------------+ 0xf0000000 * | Cur. Page Table (Kern. RW) | RW/-- PTSIZE * VPT,KSTACKTOP--> +------------------------------+ 0xefc00000 --+ * | Kernel Stack | RW/-- KSTKSIZE | * | - - - - - - - - - - - - - - -| PTSIZE * | Invalid Memory (*) | --/-- | * ULIM ------> +------------------------------+ 0xef800000 --+ * | Cur. Page Table (User R-) | R-/R- PTSIZE * UVPT ----> +------------------------------+ 0xef400000 * | RO PAGES | R-/R- PTSIZE * UPAGES ----> +------------------------------+ 0xef000000 * | RO ENVS | R-/R- PTSIZE * UTOP,UENVS ------> +------------------------------+ 0xeec00000 * UXSTACKTOP -/ | User Exception Stack | RW/RW PGSIZE * +------------------------------+ 0xeebff000 * | Empty Memory (*) | --/-- PGSIZE * USTACKTOP ---> +------------------------------+ 0xeebfe000 * | Normal User Stack | RW/RW PGSIZE * +------------------------------+ 0xeebfd000 * | | * | | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * . . * . . * . . * |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| * | Program Data & Heap | * UTEXT --------> +------------------------------+ 0x00800000 * PFTEMP -------> | Empty Memory (*) | PTSIZE * | | * UTEMP --------> +------------------------------+ 0x00400000 --+ * | Empty Memory (*) | | * | - - - - - - - - - - - - - - -| | * | User STAB Data (optional) | PTSIZE * USTABDATA ----> +------------------------------+ 0x00200000 | * | Empty Memory (*) | | * 0 ------------> +------------------------------+ --+ * * (*) Note: The kernel ensures that "Invalid Memory" (ULIM) is *never* * mapped. "Empty Memory" is normally unmapped, but user programs may * map pages there if desired. JOS user programs map pages temporarily * at UTEMP. */// All physical memory mapped at this address#define KERNBASE 0xF0000000// At IOPHYSMEM (640K) there is a 384K hole for I/O. From the kernel,// IOPHYSMEM can be addressed at KERNBASE + IOPHYSMEM. The hole ends// at physical address EXTPHYSMEM.#define IOPHYSMEM 0x0A0000#define EXTPHYSMEM 0x100000// Virtual page table. Entry PDX[VPT] in the PD contains a pointer to// the page directory itself, thereby turning the PD into a page table,// which maps all the PTEs containing the page mappings for the entire// virtual address space into that 4 Meg region starting at VPT.#define VPT (KERNBASE - PTSIZE)#define KSTACKTOP VPT#define KSTKSIZE (8*PGSIZE) // size of a kernel stack#define ULIM (KSTACKTOP - PTSIZE) /* * User read-only mappings! Anything below here til UTOP are readonly to user. * They are global pages mapped in at env allocation time. */// Same as VPT but read-only for users#define UVPT (ULIM - PTSIZE)// Read-only copies of the Page structures#define UPAGES (UVPT - PTSIZE)// Read-only copies of the global env structures#define UENVS (UPAGES - PTSIZE)/* * Top of user VM. User can manipulate VA from UTOP-1 and down! */// Top of user-accessible VM#define UTOP UENVS// Top of one-page user exception stack#define UXSTACKTOP UTOP// Next page left invalid to guard against exception stack overflow; then:// Top of normal user stack#define USTACKTOP (UTOP - 2*PGSIZE)// Where user programs generally begin#define UTEXT (2*PTSIZE)// Used for temporary page mappings. Typed 'void*' for convenience#define UTEMP ((void*) PTSIZE)// Used for temporary page mappings for the user page-fault handler// (should not conflict with other temporary page mappings)#define PFTEMP (UTEMP + PTSIZE - PGSIZE)// The location of the user-level STABS data structure#define USTABDATA (PTSIZE / 2) #ifndef __ASSEMBLER__/* * The page directory entry corresponding to the virtual address range * [VPT, VPT + PTSIZE) points to the page directory itself. Thus, the page * directory is treated as a page table as well as a page directory. * * One result of treating the page directory as a page table is that all PTEs * can be accessed through a "virtual page table" at virtual address VPT (to * which vpt is set in entry.S). The PTE for page number N is stored in * vpt[N]. (It's worth drawing a diagram of this!) * * A second consequence is that the contents of the current page directory * will always be available at virtual address (VPT + (VPT >> PGSHIFT)), to * which vpd is set in entry.S. */typedef uint32_t pte_t;typedef uint32_t pde_t;extern volatile pte_t vpt[]; // VA of "virtual page table"extern volatile pde_t vpd[]; // VA of current page directory/* * Page descriptor structures, mapped at UPAGES. * Read/write to the kernel, read-only to user programs. * * Each Page describes one physical page. * You can map a Page * to the corresponding physical address * with page2pa() in kern/pmap.h. */LIST_HEAD(Page_list, Page);typedef LIST_ENTRY(Page) Page_LIST_entry_t;struct Page { Page_LIST_entry_t pp_link; /* free list link */ // pp_ref is the count of pointers (usually in page table entries) // to this page, for pages allocated using page_alloc. // Pages allocated at boot time using pmap.c's // boot_alloc do not have valid reference count fields. uint16_t pp_ref;};#endif /* !__ASSEMBLER__ */#endif /* !JOS_INC_MEMLAYOUT_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -