linux虚拟内存④:段与缺页

本文深入探讨了Linux系统中虚拟内存的组织方式与管理机制。详细介绍了进程地址空间的构成,包括代码段、数据段等,并解释了如何通过链表结构记录各段信息。此外,还分析了缺页异常处理流程及内存管理单元MMU的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux虚拟内存系统

Linux将进程的地址空间,将虚拟内存区域组成一些区域(段)的集合。一个区域就是已分配的虚拟内存连续片(chunk),这些段通过某种方式相互链接。

一个进程的地址空间由下而上由多个不同类型的连续区域(段)组合而成:代码段、初始化数据段、未初始化数据段、运行时堆区域、共享库的映射区域、运行时栈区域、内核代码和数据段(多个进程通过虚拟内存方式共享)、内核为每个进程维护的元数据(页表、task_struct、mm结构)

它们在虚拟地址空间中内部连续,中间则存在空隙,内核通过链表(早期)来记录这些段的位置信息,访问权限等

task_struct中保存有内核运行进程的基本信息,PID、用户进程栈指针、程序计数器PC等

Linux采取链表组织多个段区域

在这里插入图片描述

task_struct结构中mm_struct结构用于维护进程的虚拟内存空间,其核心是mmap结构,即一个维护每个虚拟内存段的链表,每一个vm_area_struct结构记录了一个虚拟内存段的基本信息。

vm_strat指向这个区域的起始位置
vm_end指向这个区域的结束位置
vm_prot区域的访问权限,如代码段只读
vm_flag一些标记位,进程是否私有或共享
vm_next指向链表中的下一个区域结构

Linux缺页异常处理

MMU内存管理单元在引用一个虚拟地址时,会执行一个前置判断,其基本过程如下:

①虚拟地址A位置是否合法,即地址A是否在某个合法的区域内,其具体的做法是遍历每个区域结构,判断地址A是否在某个区域的vm_start和vm_end之间。如果不再某个区域内,触发一个段访问错误

虚拟地址空间可能包含很多这样的区域,链表遍历查找会很耗时,Linux在链表基础之上实现了一个查找树,并借此提高查找速度。

②试图访问的内存是否有合法的权限,进程是否有读写该区域的权限。例如运行在用户模式下的进程无法对代码段执行写操作,否则触发一个保护异常。

③若一切顺利,内核确认对地址A的引用存在且合法,那么执行页面置换逻辑,将相应的虚拟页置换进主内存中,缺页中断完成后,MMU即可对该虚拟内存正常的引用。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值