内存映射
我们的系统采用的是页式管理机制,主存空间按页分配。在
proc
进程结构体中增加mmap_info
数组mmap_pool
用于记录当前进程内存映射的信息。其中,used
字段用于标记该mmap_info
是否被使用;start
字段记录内存映射起始虚拟地址;len
字段保存内存映射的地 址空间的大小;prot
记录映射区的保护权限;flags
记录映射区的特性;fd
记录映射文件的文件描述符;offset
字段保存相对文件开始处的偏移。struct mmap_info{
int used;
uint64 start;
uint64 len;
int prot;
int flags;
int fd;
off_t offset;
};
在实现
mmap
映射时,需要进行以下操作- 1.在当前进程的
mmap_pool
中找到可用的区域,用于保存mmap
的信息,未找到则返回-1; - 2.根据文件描述符找到对应的文件,获取文件内部的
struct dirent
结构体指针ep
; - 3.从给定的偏移开始,读取文件的内容,同时增长当前进程虚拟地址空间的大小,将文件的内容拷贝至新增的那段虚拟地址空间对应的物理内存中,根据
prot
参数设置内存空间的读、写与执行权限。 - 4.将所使用的
mmap_info
的used
字段置为1,同时将文件描述符fd
对应文件的引用计数加1;
munmap
的实现相对简单,首先需要根据起始虚拟地址start
以及映射大小len
在当前进程的mmap_pool
找到对应的mmap_info
,获取映射文件、偏移等信息,为后续的处理做准备。接下来就是处理文件的写入问题了,我们采取的策略是读取映射页面的PTE
页表项,根据PTE
的Dirty
位是否为1来确定要不要将映射内存的信息写入文件对应的位置中。最后将mmap_info
里面的used
字段置为0,以及文件描述符fd对应的文件的引用数减1即可。Last modified 5mo ago