简单了解内存
1. 物理内存与虚拟内存
- 物理内存: 计算机、手机、车机等安装的实际 RAM 芯片。
- 虚拟内存:现代操作系统设计的一种内存管理技术程序。 每个进程看到的、由操作系统提供的一个巨大的、连续的、私有的地址空间(通常 32 位系统为 4GB,64 位系统则大得多)。它是对物理内存的抽象和扩展。
截图展示了 64位操作系统的 虚拟内存空间 和 一个程序的内存布局
浅学知识点:(简单了解一点)
物理内存——————————对应——————————物理地址(Physical Address, PA)
虚拟内存——————————对应——————————虚拟地址(Virtual Address, VA)
可执行文件(程序)中的内存地址都是属于虚拟地址, 通过操作系统分页技术处理,映射到物理地址上。
-
32位操作系统: 每个程序都有0x00000000 ~ 0xFFFFFFFF 这么大的虚拟地址空间
-
64位操作系统: 每个程序都有0x-0000000000000000 ~ 0xFFFFFFFFFFFFFFFF 这么大的虚拟地址空间
一个程序(如: QQ、微信、网易云音乐)的内存布局(虚拟):
| 内存区域 | 作用说明 |
|---|---|
| 只读代码段(Text Segment) | 存放程序的可执行机器指令(即编译后的代码)。通常是只读的,防止代码被意外或恶意修改。 |
| 只读数据段(.rodata) | 存放常量数据,如字符串常量、全局常量等。只读,防止运行时修改。 |
| 读写数据段(Data Segment) | 存放已初始化的全局变量和静态变量。程序加载时分配,生命周期贯穿整个程序运行过程。 |
| BSS段(未初始化数据段) | 存放未初始化的全局变量和静态变量。程序启动时自动清零。 |
| 运行时堆(Heap) | 用于动态内存分配(如 malloc、new)。由程序员手动申请/释放,空间较大,向上增长。 |
| 函数栈(Stack) | 用于存放函数调用的局部变量、返回地址、参数等。由系统自动管理,向下增长,函数调用结束后自动释放。 |
一个程序的虚拟地址如何找到它真实的物理地址——————> MMU
MMU(Memory Management Unit,内存管理单元)是操作系统中一个重要的硬件组件,它负责管理 CPU 对内存的访问。MMU 的主要作用是将虚拟内存地址转换为物理内存地址,同时提供内存保护、内存分段、分页等功能,以支持现代操作系统中的多任务处理和内存管理机制。
| 功能模块 | 作用说明 |
|---|---|
| 地址翻译(Address Translation) | 将程序使用的虚拟地址(逻辑地址)转换为实际的物理地址。 |
| 分页管理(Paging) | 将内存划分为固定大小的页面(通常为 4KB)。每个页面可以独立映射到物理内存中的任意位置。 |
| 分段管理(Segmentation) | 将内存划分为不同大小的段,每个段对应程序中的一个逻辑单元(如代码段、数据段)。 |
| 内存保护(Memory Protection) | 确保每个进程只能访问自己分配的内存区域,防止进程之间的相互干扰。 |
| 缓存管理(Cache Management) | 管理 CPU 缓存与物理内存之间的数据一致性,提高内存访问速度。 |
| 内存映射(Memory Mapping) | 允许将设备内存或文件映射到进程的地址空间,方便直接访问硬件设备或文件内容。 |
| 页面置换(Page Replacement) | 当物理内存不足时,选择将某些页面从物理内存置换到磁盘(如交换分区),以释放空间。 |
MMU 的工作原理可以简单概括为以下几个步骤:
- 地址翻译:
- 程序运行时,使用虚拟地址访问内存。
- MMU 使用页表(Page Table)或段表(Segment Table)将虚拟地址转换为物理地址。
- 页表是一个数据结构,记录虚拟页面到物理页面的映射关系。
- 内存保护:
- MMU 检查访问请求是否合法(如是否有读写权限)。
- 如果访问非法,会触发一个异常(如段错误)。
- 页面置换:
- 当物理内存不足时,MMU 会触发页面置换算法,将某些不常用的页面置换到磁盘。
- 当需要访问这些页面时,再从磁盘加载回物理内存。
- 缓存管理:
- MMU 与 CPU 缓存协同工作,确保缓存中的数据与物理内存中的数据保持一致。
- 使用缓存可以显著提高内存访问速度。
2.分页
- 物理内存和虚拟内存都被划分为固定大小的块(通常是 4KB,也有大页的),称为 页帧 或 页。
- 这是现代内存管理的基础,允许非连续分配。
3.页表
- 每个进程都有自己的页表(由内核管理)。
- 它存储着 虚拟页帧 到 物理页帧 的映射关系。
- CPU 的内存管理单元在执行指令访问虚拟地址时,会自动查询页表来完成虚拟地址到物理地址的转换。
- 多级页表:为了解决管理巨大虚拟地址空间带来的页表过大问题,Linux 使用多级页表(如 4 级页表),只有实际使用的部分才需要分配内存。
物理寻址
看的见摸得着的物理内存(也叫运行内存, 平时计算机上的内存条RAM。 8、16、32G等运行内存), CPU使用物理地址,来访问内存——》物理寻址(Physical Address, PA)
-
数据总线:负责传输实际数据
-
地址总线:负责传输数据地址的,用来确定到底把数据传输到哪里去(是内存的某个位置,还是某个I/O设备)
-
控制总线:负责传输控制信号的,用于控制对于总线的访问
mov %eax, 0x3 将地址0x3起的数据赋值到寄存器eax中
分段寻址
早期x86架构的操作系统,核心内存管理机制,在现代计算机系统中已不再是主流寻址方式,不做介绍,可以AI了解
虚拟寻址
虚拟内存管理技术,CPU使用虚拟地址(Virtual Address , VA)来访问主存。
虚拟地址————“地址转换”————物理地址
好处:
- 使用虚拟寻址的方式, 可以起到内存保护的作用,使得每个程序的内存相互隔离,一个程序的内存不会被其他的程序破坏,从而可以实现,在内存中同时存储多个程序
- 降低用户态程序对内存使用的复杂度
分页寻址
它也是一种 虚拟内存管理技术, CPU 和操作系统通过它,将每个程序使用的 虚拟地址(或逻辑地址) 转换成物理内存上的 物理地址。
目的:
内存抽象:每个程序都感觉自己拥有连续、独立且完整的地址空间(例如 0x0 到 0x7FFFFFFFFFFF),无需关心物理内存的实际布局、碎片或其他程序的存在。
内存保护:操作系统可以为不同的内存页设置访问权限(读、写、执行),防止程序非法访问其他程序或内核的内存。
按需分页:程序启动时并非所有代码和数据都加载到物理内存。当程序访问一个尚未加载的“虚拟页”时,CPU 触发 缺页异常 ,操作系统负责将所需数据从磁盘调入物理内存,然后恢复程序执行。这极大地节省了物理内存。
物理内存扩展:利用磁盘空间作为“后备存储”,使得程序可使用的虚拟地址空间远大于实际安装的物理内存容量。
Linux x86-64 操作系统 支持 :四级页表、 五级页表
以 1页大小=4kb 为标准, 四级页表为例, 下图展示了一页的概图: