实验内容
- 这个实验的目标是优化 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);
}
文章转载自: