HW4-lazy-page-allocation

操作系统可以使用页表硬件的许多巧妙技巧之一是堆内存的延迟分配。xv6 应用程序使用 sbrk() 系统调用向内核请求堆内存。在我们提供给的内核中,sbrk() 分配物理内存并将其映射到进程的虚拟地址空间。有些程序分配内存但从不使用它,例如实现大型稀疏数组。复杂的内核会延迟每个内存页面的分配,直到应用程序尝试使用该页面(如缺页错误)。在本练习中,将此延迟分配功能添加到 xv6。

作业链接:https://pdos.csail.mit.edu/6.828/2018/homework/xv6-zero-fill.html

Part One: Eliminate allocation from sbrk()

从 sbrk(n) 系统调用中,删除页分配。系统调用 sbrk(n) 增加进程空间 n bytes,然后返回新分配的区域的起始地址。

修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
int
sys_sbrk(void)
{
int addr;
int n;

if(argint(0, &n) < 0)
return -1;
addr = myproc()->sz;
myproc()->sz += n;
return addr;
}

结果

Part Two: Lazy allocation

在 trap.c 中,添加对页错误的处理。

在 trap() 函数中,命名 char *mem,然后映射分配的物理页;如果映射之后还出现缺页错误,则会反复触发 T_PGFLT,然后反复分配一个页面来映射。

同时,将 mappages 的 static 删除。

1
2
3
4
5
6
7
8
9
10
case T_PGFLT:
mem = kalloc();
if(mem != 0){
uint va = PGROUNDDOWN(rcr2());
memset(mem, 0 ,PGSIZE);
extern int mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm);
if(mappages(myproc()->pgdir, (void*)va, PGSIZE, V2P(mem), PTE_W|PTE_U)>=0){
break;
}
}

结果


HW4-lazy-page-allocation
https://www.bencorn.com/2023/07/22/HW4-lazy-page-allocation/
作者
Bencorn
发布于
2023年7月22日
许可协议