mmappages
映射虚拟内存与物理地址,fs提供的接口 readi
读取fd对应的文件page fault
机制对文件进行copy on read&write 读取,我们需要支持比实际物理内存大得多的文件PTE_MMAP
vma
,它包含了内存映射文件剩余的大小、下一个vma的指针、起始的虚拟地址、权限、是否shared等等大于文件大小但小于一页的部分需要用0补齐
只读方式打开的文件可以以 private writable 的方式进行内存映射,而shared不行
奇怪的bug:明明还有很多物理页,此时却显示没有了:
由于kalloc的逻辑是:
它会把下一个物理页的地址直接放在本页的首部区域,这个数据可能被某个跨界的读写操作修改了,且至少修改了8个字节的数据。比如这段代码:
修改后就ok了:
只复制了5页,而原页表有9页。所以mmap时应该需要增加p->sz,munmap时需要减去一定的大小
mmap映射的文件可能是支零破碎的,因为你可能还有很多munnap,这导致了如今的uvmunmap的逻辑不适用——它假定从va开始一段内存都有效,都是连续的。
需要单独映射mmap页到一个位置,由于实验保证不会在中间打洞,所以可以保持uvmunmap的逻辑不变。于是原先的mmap和munmap改变sz可以作废,另外需在exit中单取消映射这一段内存