阅读材料
- 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);
}