实验内容
- 这个实验的目标是优化 xv6 中的某些系统调用(如
getpid()
),通过共享内存的方式减少用户态和内核态之间的切换开销。 - 其中,物理地址在
kernel/memlayout.h
中定义
#define USYSCALL (TRAPFRAME - PGSIZE)
struct usyscall {
int pid;
};
修改内容
struct proc {
struct usyscall *usyscall;
};
kernel/proc.c
中分配共享页面(分配物理页)
static struct proc*
allocproc(void)
{
if((p->usyscall = (struct usyscall *)kalloc()) == 0){
freeproc(p);
release(&p->lock);
return 0;
}
p->usyscall->pid = p->pid;
}
kernel/proc.c
中释放共享页面(回收物理页)
static void
freeproc(struct proc *p)
{
if(p->usyscall)
kfree((void*)p->usyscall);
p->usyscall = 0;
}
kernel/proc.c
中添加映射(映射虚拟地址和物理页)
pagetable_t
proc_pagetable(struct proc *p)
{
if(mappages(pagetable, USYSCALL, PGSIZE,
(uint64)(p->usyscall), PTE_R | PTE_U) < 0){
uvmunmap(pagetable, TRAMPOLINE, 1, 0);
uvmunmap(pagetable, TRAPFRAME, 1, 0);
uvmfree(pagetable, 0);
return 0;
}
return pagetable;
}
void
proc_freepagetable(pagetable_t pagetable, uint64 sz)
{
uvmunmap(pagetable, TRAMPOLINE, 1, 0);
uvmunmap(pagetable, TRAPFRAME, 1, 0);
uvmunmap(pagetable, USYSCALL, 1, 0);
uvmfree(pagetable, sz);
}