内存映射

mmap系统调用

我们的系统采用的是页式管理机制,主存空间按页分配。在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_infoused字段置为1,同时将文件描述符fd对应文件的引用计数加1;

munmap系统调用

munmap的实现相对简单,首先需要根据起始虚拟地址start以及映射大小len在当前进程的mmap_pool找到对应的mmap_info,获取映射文件、偏移等信息,为后续的处理做准备。接下来就是处理文件的写入问题了,我们采取的策略是读取映射页面的PTE页表项,根据PTEDirty位是否为1来确定要不要将映射内存的信息写入文件对应的位置中。最后将mmap_info里面的used字段置为0,以及文件描述符fd对应的文件的引用数减1即可。

Last updated