本Lab为xv6添加一个lazy page allocation的功能。
笔者用时约1.5h(这个实验相对比较简单哩
概述
xv6中的用户程序使用sbrk系统调用向内核请求增长堆内存或者缩减堆内存。对于增长内存的情况,用户往往会申请多于实际需要的内存以便使用。于是,对于暂未使用的内存,如果在用户申请时就将其分配给用户,挺浪费的。Lazy page allocation基于这样一种思想,当用户申请增长内存时,暂时不分配物理内存,而是仅增长用户进程的空间大小。这时如果用户实际使用到了新分配的内存,则会引发page fault(因为进程页表暂未维护该内存的虚拟地址与物理地址的映射)。page fault其实是trap的一种,在原始xv6代码中并为做特殊处理,而是仅仅杀死引发该page fault的进程。而要实现lazy page allocation,我们需要对page fault进行处理,其实就是对找不到映射的虚拟地址分配物理地址并在页表中添加映射。具体实现就是这个实验做的事情。
Eliminate allocation from sbrk()
这一部分就是删除sbrk对应的系统调用函数sys_sbrk(定义在kernel/sysproc.c:42)中的页面分配代码,因为初始代码是一申请就分配的,现在我们想要延迟分配,只需要在sbrk被调用时,如果参数大于0,则增加进程的内存大小即可;如果参数小于0,参考growproc的处理方式即可,如下所示。
uint64
sys_sbrk(void)
{
int addr;
int n;
struct proc* p = myproc();
if(argint(0, &n) < 0)
return -1;
addr = p->sz;
if (n > 0) {
p->sz += n;
} else if (n < 0) {
p->sz = uvmdealloc(p->pagetable, p->sz, p->sz + n);
}
// if(growproc(n) < 0)
// return -1;
return addr;
}
Lazy allocation
这一部分需要我们处理page fault,为暂未分配物理内存但是在合理范围内的虚拟地址分配内存并在进程页表中维护映射。
这里的合理范围指的是,地址大小小于当前进程的内存大小,大于当前进程的栈底地

文章介绍了如何在xv6操作系统中添加懒惰页分配功能,通过消除sbrk系统调用中的内存分配,仅在pagefault发生时才分配物理内存。详细阐述了修改sys_sbrk、处理pagefault以及解决uvmunmap和uvmcopy过程中遇到的问题,确保进程能正确处理未分配的虚拟地址。
最低0.47元/天 解锁文章
3427

被折叠的 条评论
为什么被折叠?



