在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)插入进程的虚拟地址区域链表或树中