之前第一遍学习mmap的时候很多人都说它有很多优点,也翻了一些大佬的博客,发现并不是很能理解,最近钻研了虚拟内存的知识之后豁然开朗,让我对mmap有了新的认识,在这里简单的总结一下。
建议如果大家对一些概念性的东西不是很理解的话可以先看一看《深入理解计算机系统》的第九章,之后你可能会跟我一样豁然开朗哈哈哈。
Linux进程虚拟内存
学过linux应该对这个图非常了解,从这个图中可以看出Linux把虚拟内存组织成一些段的集合,一个段就是已经分配的虚拟内存的连续片。
内核为每个进程维护了一个任务结构(task_struct),内核用这个结构体来描述一个进程,这个结构包含了进程的一些信息,包括进程id,可执行文件名,指向用户栈的指针以及上下文的task结构体的指针等等,不过其中我们最关心的还是其中指向mm_struct结构体的条目,这个结构体描述了当前进程的状态,而这个mm_struct结构体中有两个比较重要的条目,一个是pgd,他指向一级页表的基址,便于根据虚拟地址查询页表,另一个是mmap,他指向一个vm_area_struct的链式结构,这个链式结构用来描述一个段,其中包括一个段的起止虚拟地址,标志访问权限的权限位,标志是否是共享区的标志位。这些标志的意义就是CPU要操作一块数据时,内核会先遍历这个vm_area_struct链表(为了便于搜索,其实他既是一个链表,还是一个树),如果查不到属于某一块&#