void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
本实验实现了简易的mmap syscall(阉割版). 实现所谓的将”文件映射到内存”
对比
- 现代OSmmap : disk -> kernel buf. user va映射到kernel bu
- 实现的xv6mmap : disk -> kernel buf -> user physical mem. user va映射到 physical mem
- 且没有实现MAP_PRIVATE,MAP_SHARED时的共享mem,也没实现MAP_PRIVATE的cow
实现关键 : lazy allocation
- mmap 先获取一块vma区域 但并不建立映射, 仅仅设定这块va合法 ; 当发生pgfault的时候,再读取文件相应内容 , 为va建立映射 , 然后返回.
- munmap 就是解除vma内建立了映射的va
mmap优势
- 效率高,高于普通的read file
- 比起read少一次拷贝. 映射到kenerl buf
- 减少陷入内核次数,减少上下文切换开销.(read每次都陷入)
- lazy allocation(不必一次全部读入)
- 更加方便user读写文件
- 这也就是mmap所谓的 “映射文件到用户进程”。
- user调用mmap之后 , 可以将对内存的读写看成对文件的读写,如何加载数据,如何落入磁盘 等都不需要user管.
- 效率高,高于普通的read file
prot : 对内存权限 ; flags : 对file权限。 二者不可冲突