阅读材料
- Xv6代码:memlayout.h、proc.h、proc.c
- 教材3.6节
进程地址空间初始化
proc_pagetable函数
该函数用于初始化一个用户进程的地址空间,返回该地址空间的根页表基地址。该函数只干两件事:映射trampoline页到最高虚拟地址处,映射tramframe页到trampoline下一页
pagetable_t proc_pagetable(struct proc *p)
{pagetable_t pagetable;// An empty page table.pagetable = uvmcreate();if (pagetable == 0)return 0;// map the trampoline code (for system call return)// at the highest user virtual address.// only the supervisor uses it, on the way// to/from user space, so not PTE_U.if (mappages(pagetable, TRAMPOLINE, PGSIZE, (uint64)trampoline, PTE_R | PTE_X) < 0){uvmfree(pagetable, 0);return 0;}// map the trapframe page just below the trampoline page, for// trampoline.S.if (mappages(pagetable, TRAPFRAME, PGSIZE, (uint64)(p->trapframe), PTE_R | PTE_W) < 0){uvmunmap(pagetable, TRAMPOLINE, 1, 0);uvmfree(pagetable, 0);return 0;}return pagetable;
}
proc_freepagetable函数
- 移除trampoline区域映射。
- 移除traoframe区域映射。
- 释放进程所占物理空间大小的页表内存
void proc_freepagetable(pagetable_t pagetable, uint64 sz)
{uvmunmap(pagetable, TRAMPOLINE, 1, 0);uvmunmap(pagetable, TRAPFRAME, 1, 0);uvmfree(pagetable, sz);
}
参考文献
8. 用户态虚拟内存 | XV6 源代码阅读指南 (gitbook.io)