代码:https://github.com/RedemptionC/xv6-riscv-6s081/tree/lazy
本实验要实现的是lazy allocation
很多时候,一个进程可能使用sbrk申请了大量的内存,但是其中的大部分并没有使用,造成了浪费
我们要做的是修改sbrk的实现,sbrk不分配物理内存,just remember which addresses are allocated
当进程第一次试图使用任何内存时,产生一个page fault,再让kernel分配内存,清零,映射
本实验涉及了第三章和第四章的内容,所以要看的还是挺多的
分析:因为我们没有实际分配内存(建立pte),所以用户程序访问对应地址时就会page fault,也就是一个来自用户空间的trap(异常)
根据第四章,page fault(trap)时,硬件会做这些事:
禁用中断(clear sie bit in sstatus)
把pc复制到sepc
保存当前mode到sstatus的spp bit
设置scause为trap的原因
设置模式为supervisor
把stvec的值设为pc(stvec保存trap handler的地址)
从pc执行(执行trap handler)
struct trapframe {
/* 0 */ uint64 kernel_satp; // kernel page table
/* 8 */ uint64 kernel_sp; // top of process's kernel stack
/* 16 */ uint64 kern

本文详细介绍了在XV6操作系统中实现懒惰页面分配的实验过程,包括修改sbrk以延迟物理内存分配,处理页表打印、消除sbrk分配、用户测试等挑战。实验涉及到页表、页故障处理、内存管理和虚拟内存等概念。
最低0.47元/天 解锁文章
33万+





