浅学内存寻址

106 阅读7分钟

简单了解内存

1. 物理内存与虚拟内存

  • 物理内存: 计算机、手机、车机等安装的实际 RAM 芯片。

展示物理内存芯片.png

  • 虚拟内存:现代操作系统设计的一种内存管理技术程序。 每个进程看到的、由操作系统提供的一个巨大的、连续的、私有的地址空间(通常 32 位系统为 4GB,64 位系统则大得多)。它是对物理内存的抽象和扩展。

image.png 截图展示了 64位操作系统的 虚拟内存空间 和 一个程序的内存布局

浅学知识点:(简单了解一点)

物理内存——————————对应——————————物理地址(Physical Address, PA)

虚拟内存——————————对应——————————虚拟地址(Virtual Address, VA)

可执行文件(程序)中的内存地址都是属于虚拟地址, 通过操作系统分页技术处理,映射到物理地址上。

  • 32位操作系统: 每个程序都有0x00000000 ~ 0xFFFFFFFF 这么大的虚拟地址空间

  • 64位操作系统: 每个程序都有0x-0000000000000000 ~ 0xFFFFFFFFFFFFFFFF 这么大的虚拟地址空间

一个程序(如: QQ、微信、网易云音乐)的内存布局(虚拟):

内存区域作用说明
只读代码段(Text Segment)存放程序的可执行机器指令(即编译后的代码)。通常是只读的,防止代码被意外或恶意修改。
只读数据段(.rodata)存放常量数据,如字符串常量、全局常量等。只读,防止运行时修改。
读写数据段(Data Segment)存放已初始化的全局变量和静态变量。程序加载时分配,生命周期贯穿整个程序运行过程。
BSS段(未初始化数据段)存放未初始化的全局变量和静态变量。程序启动时自动清零。
运行时堆(Heap)用于动态内存分配(如 mallocnew)。由程序员手动申请/释放,空间较大,向上增长。
函数栈(Stack)用于存放函数调用的局部变量、返回地址、参数等。由系统自动管理,向下增长,函数调用结束后自动释放。

一个程序的虚拟地址如何找到它真实的物理地址——————> MMU

image.png

MMU(Memory Management Unit,内存管理单元)是操作系统中一个重要的硬件组件,它负责管理 CPU 对内存的访问。MMU 的主要作用是将虚拟内存地址转换为物理内存地址,同时提供内存保护、内存分段、分页等功能,以支持现代操作系统中的多任务处理和内存管理机制。

功能模块作用说明
地址翻译(Address Translation)将程序使用的虚拟地址(逻辑地址)转换为实际的物理地址。
分页管理(Paging)将内存划分为固定大小的页面(通常为 4KB)。每个页面可以独立映射到物理内存中的任意位置。
分段管理(Segmentation)将内存划分为不同大小的段,每个段对应程序中的一个逻辑单元(如代码段、数据段)。
内存保护(Memory Protection)确保每个进程只能访问自己分配的内存区域,防止进程之间的相互干扰。
缓存管理(Cache Management)管理 CPU 缓存与物理内存之间的数据一致性,提高内存访问速度。
内存映射(Memory Mapping)允许将设备内存或文件映射到进程的地址空间,方便直接访问硬件设备或文件内容。
页面置换(Page Replacement)当物理内存不足时,选择将某些页面从物理内存置换到磁盘(如交换分区),以释放空间。

MMU 的工作原理可以简单概括为以下几个步骤:

  1. 地址翻译
    • 程序运行时,使用虚拟地址访问内存。
    • MMU 使用页表(Page Table)或段表(Segment Table)将虚拟地址转换为物理地址。
    • 页表是一个数据结构,记录虚拟页面到物理页面的映射关系。
  2. 内存保护
    • MMU 检查访问请求是否合法(如是否有读写权限)。
    • 如果访问非法,会触发一个异常(如段错误)。
  3. 页面置换
    • 当物理内存不足时,MMU 会触发页面置换算法,将某些不常用的页面置换到磁盘。
    • 当需要访问这些页面时,再从磁盘加载回物理内存。
  4. 缓存管理
    • MMU 与 CPU 缓存协同工作,确保缓存中的数据与物理内存中的数据保持一致。
    • 使用缓存可以显著提高内存访问速度。

2.分页

  • 物理内存和虚拟内存都被划分为固定大小的块(通常是 4KB,也有大页的),称为 页帧
  • 这是现代内存管理的基础,允许非连续分配。

3.页表

  • 每个进程都有自己的页表(由内核管理)。
  • 它存储着 虚拟页帧 到 物理页帧 的映射关系。
  • CPU 的内存管理单元在执行指令访问虚拟地址时,会自动查询页表来完成虚拟地址到物理地址的转换。
  • 多级页表:为了解决管理巨大虚拟地址空间带来的页表过大问题,Linux 使用多级页表(如 4 级页表),只有实际使用的部分才需要分配内存。

物理寻址

看的见摸得着的物理内存(也叫运行内存, 平时计算机上的内存条RAM。 8、16、32G等运行内存), CPU使用物理地址,来访问内存——》物理寻址(Physical Address, PA)

image.png

  1. 数据总线:负责传输实际数据

  2. 地址总线:负责传输数据地址的,用来确定到底把数据传输到哪里去(是内存的某个位置,还是某个I/O设备)

  3. 控制总线:负责传输控制信号的,用于控制对于总线的访问

    mov %eax, 0x3 将地址0x3起的数据赋值到寄存器eax中

image.png

分段寻址

早期x86架构的操作系统,核心内存管理机制,在现代计算机系统中已不再是主流寻址方式,不做介绍,可以AI了解

虚拟寻址

虚拟内存管理技术,CPU使用虚拟地址(Virtual Address , VA)来访问主存。

虚拟地址————“地址转换”————物理地址

image.png

好处:

  1. 使用虚拟寻址的方式, 可以起到内存保护的作用,使得每个程序的内存相互隔离,一个程序的内存不会被其他的程序破坏,从而可以实现,在内存中同时存储多个程序
  2. 降低用户态程序对内存使用的复杂度

分页寻址

它也是一种 虚拟内存管理技术, CPU 和操作系统通过它,将每个程序使用的 虚拟地址(或逻辑地址)  转换成物理内存上的 物理地址

目的:

内存抽象:每个程序都感觉自己拥有连续、独立且完整的地址空间(例如 0x0 到 0x7FFFFFFFFFFF),无需关心物理内存的实际布局、碎片或其他程序的存在。
内存保护:操作系统可以为不同的内存页设置访问权限(读、写、执行),防止程序非法访问其他程序或内核的内存。
按需分页:程序启动时并非所有代码和数据都加载到物理内存。当程序访问一个尚未加载的“虚拟页”时,CPU 触发 缺页异常 ,操作系统负责将所需数据从磁盘调入物理内存,然后恢复程序执行。这极大地节省了物理内存。
物理内存扩展:利用磁盘空间作为“后备存储”,使得程序可使用的虚拟地址空间远大于实际安装的物理内存容量。

Linux x86-64 操作系统 支持 :四级页表、 五级页表

以 1页大小=4kb 为标准, 四级页表为例, 下图展示了一页的概图:

image.png

image.png

image.png