系统调用mmap详解概述将磁盘文件映射到进程的虚拟地址空间,通过读取和修改这块内存来读取和修改文件不调用修改读、写等操作。接口及形参分析void*/*返回开启的虚拟地址空间的首地址*/mmap(void*addr,/*指定映射的起始地址,建议设置为NULL*/size_tlen,/*映射到内存的文件长度*/intprot,/*映射区的保护方式*//**PROT_EXEC:映射区可执行*PROT_READ:映射区可读*PROT_WRITE:映射区可写*/intflags,/**MAP_SHARED:写入映射区的数据将被写回磁盘文化部,并允许映射该文件的其他进程共享。*MAP_PRIVATE:对映射区的写操作将生成一个副本映射区域(写时复制),对该区域所做的修改不会写回原始文件。*/intfd,/*open返回的文件描述符表示要映射的文件*/off_toffset);/*从文件中offset的位置开始映射*/执行原理(步骤)<其中pgd记录的是第一个一级页表的首地址>在虚拟地址中为系统调用mmap创建一个vm_area_struct空间。通过文件描述符fd,在内核中找到文件对应的文件结构(structfile)。通过文件的文件结构,调用文件。file_operations.mmap函数实现文件fd与内存虚拟地址的映射关系//区别于系统调用mmap函数intmmap(structfile*filp,structvm_area_struct*vma);需要指出的是,当前磁盘中的文件内容并没有读入对应的内存地址空间,需要通过缺页中断机制将文件内容读入内存。特性缺陷不能通过mmap添加文件内容mmap减少了从内核态到用户态的数据拷贝,但是当写操作过多时,从pagecache回写到磁盘的操作是不可避免的(比相互拷贝花费的时间长很多)内存),这大大降低了mmap的用处。相关函数munmapintmunmap(void*addr,size_tlen)msyncintmsync(void*addr,size_tlen,intflags)疑惑点:flags:MS_INVALIDATEREF1FEF2mlock/munlockintmlock(void*addr,size_tlen);intmunlock(constvoid*addr,size_tlen);延展direct_ioman2open尝试将进出该文件的I/O的缓存效应降到最低。通常这会降低性能,但在特殊情况下很有用,例如当应用程序进行自己的缓存时。文件I/O直接从用户空间缓冲区完成。O_DIRECT标志本身努力同步传输数据,但不提供O_SYNC标志保证传输数据和必要的元数据。为了保证同步I/O,除了O_DIRECT之外,还必须使用O_SYNC。请参阅下面的注释以进行进一步讨论。参考资料引用0引用1引用2
