mmap的vma结构本质和内核page_fault 流程

在Linux中,VM系统通过将虚拟内存分割为称作虚拟页(Virtual Page,VP)大小固定的块来处理磁盘(较 低层)与上层数据的传输,一般情况下,每个页的大小默认是4096字节。

同样的,物理内存也被分割为物理页(Physical Page,PP),也为4096字节。

在mmap之后,并没有在将文件内容加载到物理页上,只上在虚拟内存中分配了地址空间。

当进程在访问这段地址时(通过mmap在写入或读取时FileA),若虚拟内存对应的page没有在物理内存中 缓存,则产生"缺页".

"缺页"由内核的缺页异常处理程序处理,将文件对应内容,以页为单位(4096)加载到物理内存,注意是 只加载缺页,但也会受操作系统一些调度策略影响,加载的比所需的多,这里就不展开了。

内存映射的本质

了解了什么是虚拟地址空间,那么虚拟地址空间里面装的是什么?看下图


mmap内存映射超底层(内核)实现过程

mmap内存映射的实现过程,总的来说可以分为三个阶段: 

(一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域

1、进程在用户空间调用库函数mmap,原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

2、在当前进程的虚拟地址空间中,寻找一段空闲的满足要求的连续的虚拟地址 3、为此虚拟区分配一个vm_area_struct结构,接着对这个结构的各个域进行了初始化 4、将新建的虚拟区结构(vm_area_struct)插入进程的虚拟地址区域链表或树中


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容