OK6410A 开发板 (八) 49 linux-5.11 OK6410A linux用户空间虚拟内存的管理 VMA

本文深入探讨Linux内核中的VMA(vm_area_struct)结构,它是用户空间虚拟内存管理的关键。VMA作为数据结构,用于描述进程地址空间中的内存区域,如代码段、数据段、栈和映射区域。这些区域通过链表和红黑树进行高效管理,便于增删改查操作。VMA结构包含访问权限、文件映射等相关信息,并提供了如vma_merge这样的合并功能,优化内存分配效率。
摘要由CSDN通过智能技术生成

之前介绍过了 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
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值