1. 内存管理单元(MMU)到底是干什么的?
-
简单比喻:
- MMU 是计算机中的一个“翻译官”,负责将程序看到的地址(虚拟地址)转换为实际的物理地址。
- 这就像你在地图上看到的地名(虚拟地址),而 MMU 帮你找到对应的地理位置(物理地址)。
-
核心作用:
- 地址转换:将虚拟地址映射到物理地址。
- 内存保护:确保一个程序不能访问另一个程序的内存。
- 分页管理:将内存分成小块(页),方便管理和分配。
2. MMU 包含哪些部分?
虚拟地址
- 程序使用的地址,不是真实的物理地址。
- 每个程序都有自己的虚拟地址空间。
物理地址
- 实际的硬件内存地址。
- 程序无法直接访问物理地址,必须通过 MMU 转换。
页表
- 一种数据结构,记录虚拟地址到物理地址的映射关系。
- 每个进程都有自己的页表。
分页机制
- 将内存分成固定大小的小块(页),通常是 4KB。
- 方便操作系统管理内存的分配和回收。
3. 背后到底做了哪些事情?
地址转换
- 程序请求内存:
- 程序使用虚拟地址访问内存。
- 查找页表:
- MMU 根据虚拟地址查找页表,找到对应的物理地址。
- 访问内存:
- 使用物理地址访问实际的内存。
内存保护
- 隔离进程:
- 每个进程有自己的虚拟地址空间,互不干扰。
- 权限检查:
- MMU 检查程序是否有权限访问目标内存区域。
分页管理
- 分配页:
- 操作系统根据需要分配内存页。
- 回收页:
- 当内存不足时,操作系统回收未使用的页。
4. 使用场景是什么?
- 多任务运行:
- 多个程序可以同时运行,每个程序都有自己独立的虚拟地址空间。
- 内存保护:
- 防止一个程序崩溃影响其他程序。
- 虚拟内存:
- 允许程序使用比实际物理内存更大的地址空间。
5. 底层原理是什么?
虚拟内存
- 虚拟地址空间:
- 每个进程都有自己的虚拟地址空间。
- 虚拟地址空间被分为多个页。
- 页表映射:
- 页表记录虚拟地址到物理地址的映射关系。
地址转换
- TLB(Translation Lookaside Buffer):
- 一种高速缓存,用于加速地址转换。
- 如果虚拟地址在 TLB 中找到对应物理地址,直接使用;否则查询页表。
- 页表查询:
- 如果 TLB 未命中,MMU 会查询页表,找到对应的物理地址。
分页机制
- 页大小:
- 通常为 4KB,方便管理。
- 页置换算法:
- 当内存不足时,操作系统会选择一些页写入磁盘(交换空间)。
6. 实际代码讲解
下面是一个模拟 MMU 地址转换的简化代码示例,并附有详细注释:
<?php
// 模拟内存管理单元(MMU)
class MMU {
private $pageTable = []; // 页表,记录虚拟地址到物理地址的映射
// 初始化页表
public function __construct() {
// 模拟初始化页表
$this->pageTable[0] = 100; // 虚拟页 0 映射到物理页 100
$this->pageTable[1] = 200; // 虚拟页 1 映射到物理页 200
$this->pageTable[2] = 300; // 虚拟页 2 映射到物理页 300
}
// 地址转换
public function translateAddress($virtualAddress) {
$pageSize = 4096; // 每页大小为 4KB
$pageNumber = intdiv($virtualAddress, $pageSize); // 计算虚拟页号
$offset = $virtualAddress % $pageSize; // 计算页内偏移量
if (isset($this->pageTable[$pageNumber])) {
$physicalPage = $this->pageTable[$pageNumber]; // 查找物理页号
$physicalAddress = $physicalPage * $pageSize + $offset; // 计算物理地址
echo "Virtual Address: $virtualAddress -> Physical Address: $physicalAddress\n";
return $physicalAddress;
} else {
echo "Error: Virtual address $virtualAddress is not mapped.\n";
return null;
}
}
}
// 创建 MMU 实例
$mmu = new MMU();
// 模拟程序访问虚拟地址
echo "Translating virtual address 8192:\n";
$mmu->translateAddress(8192); // 8192 是虚拟地址
echo "\nTranslating virtual address 12288:\n";
$mmu->translateAddress(12288); // 12288 是虚拟地址
echo "\nTranslating virtual address 4097:\n";
$mmu->translateAddress(4097); // 4097 是虚拟地址
注释详解
$pageTable
:- 模拟操作系统的页表,记录虚拟页号到物理页号的映射。
translateAddress($virtualAddress)
:- 将虚拟地址转换为物理地址。
- 首先计算虚拟页号和页内偏移量。
- 然后通过页表查找物理页号,计算物理地址。
echo
:- 打印输出,展示地址转换的过程和结果。
7. 图示与思维导图
思维导图
MMU 的作用
├── 地址转换
│ ├── 虚拟地址
│ └── 物理地址
├── 内存保护
│ ├── 隔离进程
│ └── 权限检查
└── 分页管理
├── 分配页
└── 回收页
流程图
程序访问内存 -> 提供虚拟地址 -> MMU 转换地址
↓ 查找页表 -> 找到物理地址 -> 访问内存
↓ 未找到 -> 报错
示意图
虚拟地址空间:
+-------------------+
| Page 0 -> 100 |
| Page 1 -> 200 |
| Page 2 -> 300 |
+-------------------+
物理地址空间:
+-------------------+
| Page 100 |
| Page 200 |
| Page 300 |
+-------------------+
UML 类图
+-------------------+
| MMU |
+-------------------+
| - pageTable: array|
+-------------------+
| + translateAddress() |
+-------------------+
8. 总结
通过以上内容,我们可以看到:
- MMU 是计算机中的翻译官,负责将虚拟地址转换为物理地址。
- 页表是实现地址转换的核心数据结构。
- 内存保护和分页管理是 MMU 的重要功能。