linux内存管理 -- 1.基础概念
本文总结了学习linux内存管理时需要掌握的基础知识、概念、术语等。
1. 逻辑地址(Logical Address)
逻辑地址是相对于程序而言的,程序在编译和链接阶段,编译器会为代码和数据分配的地址。因此,逻辑地址是包含在机器语言指令中用来指定一个操作数或一条指令的地址,它们构成了程序的逻辑地址空间。
每个逻辑地址都由一个段选择子(segment selector)和段内偏移量(offset within the segment)组成:
段选择子指向段描述符表中的一个条目,该条目包含了段的基地址。
段内偏移量指明了从段开始的地方到实际地址之间的距离。
例如,在C语言中,指针的值就是逻辑地址。
2. 线性地址(Linear Address)
线性地址是相对于操作系统而言的,也称虚拟地址(Virtual Address)。
线性地址处于逻辑地址和物理地址的中间层,由逻辑地址转换而来。
对于32位的操作系统,线性地址地址是一个32位无符号整数,范围是 0x0000 0000 到 0xffff ffff,可以表示高达4GB的地址。
不同的内存管理方式,转换机制不同:
分页式:直接将逻辑地址的页号和页内偏移量转换为线性地址。
分段式:通过段描述符将逻辑地址的段号和段内偏移量转换为线性地址。
段页式:先通过段描述符将逻辑地址转换为中间地址,再通过页表将中间地址转换为线性地址。
3. 物理地址(Physical Address)
物理地址是相对于存储介质而言的,直接指向硬件内存,是实际存储数据的位置。
物理地址由线性地址转换而来。
4. 逻辑地址、线性地址、物理地址的关系
(1)逻辑地址提供了程序的视角,线性地址提供了操作系统的视角,而物理地址提供了硬件的视角。
(2)三者处于内存管理过程中的不同阶段,它们共同协作,使得程序能够访问和操作内存,同时保持内存的安全性和隔离性。
(3)三者之间的转换过程确保了程序可以在虚拟地址空间中高效地运行,而实际内存管理和分配则在物理地址空间中进行。
(4)没有启用分页机制时,线性地址和物理地址可能是相同的,但在现代操作系统中,分页机制是常见的,因此这三个地址类型通常会有不同的值。
5. 内存控制单元(Memory Management Unit, MMU)
有时也称作分页内存管理单元(Paged Memory Management Unit,PMMU)。
MMU是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件,它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制等。
6. 页框(Page Frame)
为了方便内存管理,将实际的物理内存分为一个个大小相同的块,每一个块就是一个页框,也叫做页帧或物理帧。
每个页框都有一个编号,即页框号,页框号从0开始编号。
页框是内核管理物理内存的基本单位,物理内存的分配和回收都是基于页框进行的。
7. 外部碎片
系统在分配物理内存时,会尽量分配连续的页框。频繁的分配和回收之后,导致存在大量的小块内存夹杂在已分配内存之间,形成了外部碎片。
8. 内部碎片
物理内存分配的最小单位是页框。当实际需要的内存很小时,例如几个字节,申请内存时系统至少也会分配一个页框(4KB),导致页框的利用率很低,形成了内部碎片。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)