MIT 6.1810 · Lab mmap · 内存映射

Lab: mmap 困难

mmap 和 munmap 系统调用允许 UNIX 程序对其地址空间施加详细控制。在本实验中,你将向 xv6 添加 mmap 和 munmap,重点关注内存映射文件。

难度:困难

分支:mmap

实验日期:2026 秋季

$ git fetch
$ git checkout mmap
$ make clean

手册页(运行 man 2 mmap)显示 mmap 的声明:

void *mmap(void *addr, size_t len, int prot, int flags,
           int fd, off_t offset);

本实验只需要与内存映射文件相关的子集功能。你可以假设:

你的实现应该惰性填充页表,响应 page fault。也就是说,mmap 本身不应该分配物理内存或读取文件。相反,在 page fault 处理代码中执行这些操作。原因是确保大文件的 mmap 快速,以及映射大于物理内存的文件是可能的。

munmap 的声明:

int munmap(void *addr, size_t len);

munmap 应该删除指示地址范围中的 mmap 映射(如果有)。如果进程修改了内存并且它映射为 MAP_SHARED,修改应该首先写入文件。

你应该实现足够的 mmap 和 munmap 功能使 mmaptest 测试程序工作。你还必须确保 usertests -q 继续工作。

$ mmaptest
test basic mmap
test basic mmap: OK
test mmap private
test mmap private: OK
test mmap read-only
test mmap read-only: OK
test mmap read/write
test mmap read/write: OK
test mmap dirty
test mmap dirty: OK
test not-mapped unmap
test not-mapped unmap: OK
test lazy access
test lazy access: OK
test mmap two files
test mmap two files: OK
test fork
test fork: OK
test munmap prevents access
usertrap(): unexpected scause 0xd pid=7
            sepc=0x924 stval=0xc0001000
test munmap prevents access: OK
test writes to read-only mapped memory
usertrap(): unexpected scause 0xf pid=9
            sepc=0xaf4 stval=0xc0000000
test writes to read-only mapped memory: OK
mmaptest: all tests succeeded
$ usertests -q
usertests starting
...
ALL TESTS PASSED
$

以下是一些提示:

运行 usertests -q 确保一切仍然工作。

提交实验

时间花费

创建一个新文件 time.txt,放入一个整数,表示你花在实验上的小时数。

答案

如果本实验有问题,将答案写在 answers-mmap.txt 中。

提交

运行 make zipball,上传到 Gradescope。

可选挑战