之前介绍过了 linux 虚拟内存管理方式 有5种,其中一种(名为VMA)用于 用户空间虚拟内存的管理,本篇就介绍 VMA
VMA 是什么
task_struct 中的 mm_struct 中的 mmap(VMA) // mmap 的结构体类型 为 vm_area_struct
可以看出来 , VMA是一种数据结构,结构体类型为vm_area_struct,那么对应的就有算法
VMA 相关的数据结构 与 算法的集合 就是我们这篇要讨论的内容
用户空间 可访问的区域 是 0G-3G
当然不是 0-3G内的所有地址都可访问 , 可访问的地址空间 被称为 进程地址空间
只有做了内存申请的区域才可以被访问
做一次内存申请 , 就等价于 将 创建一个 vm_area_struct 结构体 // 一个 VMA 就是 一个 vm_area_struct 结构体
...
做N次内存申请 , 就等价于 将 创建N个 vm_area_struct 结构体
进程地址空间 就是 N 个 vm_area_struct 结构体的集合
这个 N 个 vm_area_struct 结构体 会被 放到 红黑树 和 链表中,进行管理
1个 vmap_area 结构体 可以描述什么
代码段
数据段
用户进程的栈
mmap区域
堆映射区域
VMA 相关数据结构
mm_struct
mm_struct
mmap : VMA链表 // 结构体类型为 vm_area_struct
mm_rb : VMA 红黑树
get_unmapped_data : 用来返回一段没有映射过的空间(在0-3G之间)的起始地址 , 架构相关
mmap_base : mmap 区域的 起始地址 , arm32 中 值 为 0x40000000
pgd : 进程页表的PGD目录,用于写入 cp15 页表基址寄存器(c2)
mm_users : 记录正在使用该进程地址空间的进程数目 // 场景是 多线程
mmlist : mm_struct 在的链表 // 链表头是 init进程的mm_struct中的mmlist:init_mm
start_code,end_code : 代码段 // 虽然代码段是一个VMA(VMA放到链表和红黑树就行了),但是这个VMA特殊,就拎出来了
start_data,end_data : 数据段
start_brk : 栈段
brk : 堆段
total_vm : 已经使用的进程地址空间总和 (小于3G)
vm_area_struct 即VMA
vm_area_struct
vm_start,vm_end : 内存区域 的 起始地址和结束地址
vm_next,vm_prev : 链表 // 挂载到 mm_struct 的 mmap 成员
vm_rb : 红黑树 // 挂载到 mm_struct 的 mm_rb 成员
vm_mm : 该VMA所属的 mm_struct
vm_page_port : VMA的访问权限 // 用于设置pte
vm_flags : 标志位,不知道干啥的
anon_vma_chain,anon_vma : remap 反向映射相关
// 文件相关, 为什么 VMA 中有这些成员???
vm_ops : 用于文件映射的函数集合
vm_pgoff : 文件映射的偏移量(单位,页面)
vm_file : 指向一个 被映射的文件
VMA 相关算法
红黑树与链表 : 增删改查
VMA很多时,在链表中查找指定的vma很慢,通过红黑树来加快查找速度
一般我们将 链表 视为 一个算法 , 将 红黑树视为一个算法
而 VMA算法 其实是 封装了 链表和红黑树 的 一种算法
增
insert_vm_struct
合并
vma_merge
插入时,会尝试与合适的 VMA 进行合并
查
find_vma
find_vma_prev
...
上一篇:OK6410A 开发板 (八) 50 linux-5.11 OK6410A 基于VMA的sys_mmap与sys_brk
下一篇:OK6410A 开发板 (八) 48 linux-5.11 OK6410A linux内存管理总览
推荐阅读最新更新时间:2024-11-19 19:52
设计资源 培训 开发板 精华推荐
- LTM4606EV 演示板,符合 EN55022B 标准的 28V、6A DC/DC 模块稳压器
- 【吉林ican大赛】灯光品质检测仪
- AL8808EV2,基于 AL8808 LED 驱动器的评估板
- 使用 ON Semiconductor 的 NCP1653 的参考设计
- LT1021BCN8-10 负串联电压基准的典型应用
- LT3091MPFE 简单电缆压降补偿的典型应用
- 双输出降压控制器产生 10% 准确、高效和可靠的大电流轨
- NSI45030AT1G可调电流LED串并联CCR的典型应用
- LTC3245IMSE 降压-升压型电荷泵稳压 5V 低噪声输出的典型应用电路
- LTC3833 的典型应用 - 具有差分输出检测功能的快速准确降压型 DC/DC 控制器