25用户态内存映射
2020-05-03 本文已影响0人
AndyWei123
- mmap 将虚拟地址空间映射到物理内存
- 匿名映射,即虚拟内存和物理内存直接映射
文件映射,将文件映射到虚拟内存
image.png
- get_umapped_area 获取未映射到区域
- 匿名映射:直接调用arch_get_unmapped_area 方法获取上一个vm_area_struct
- 文件映射:调用mm_struct 里面的 get_unmapped_area 函数获取上一个vm_area_struct
- mmap_region 映射物理内存到虚拟内存
- 在上一个步骤中获取到vm_area_struct 能否扩展后与前一个vm_area_struce 合并,如果不行就创建一个新的vm_area_struce并加入红黑树
- 用户态缺页中断异常
- 分配全局目录表PGD 并赋值给 mm_struce 的 pgd
image.png
cr3 是 CPU 的一个寄存器,它会指向当前进程的顶级 pgd。如果 CPU 的指令要访问进程的虚拟内存,它就会自动从 cr3 里面得到 pgd 在物理内存的地址,然后根据里面的页表解析虚拟内存的地址为物理内存,从而访问真正的物理内存上的数据。
-
handle_pte_fault
-
do_anonymous_page 处理匿名页,通过伙伴系统的 __alloc_pages_nodemask 方法获取内存
-
映射到文件: do_fault,最终我们会调用 __do_fault
-
do_swap_page
-
TLB(Translation Lookaside Buffer) 块表,将内存中的虚拟地址和物理的是映射关系通过LRU列表缓存起来
image.png
总介绍图片
image.png