虚拟内存,页面,MMU
最后更新于:2022-04-02 04:09:07
[TOC]
## 只有 32Kb 内存,如果抽象出64Kb内幕才能让进程使用
1. 将内存分成很多小块,进程可以使用离散的小块
2. 解决进程轮流使用内存( Swapping小块)
## 虚拟地址空间(页表)
- 程序运行在虚拟地址空间,遇到内存地址就映射到物理空间。
`(page,offset) = (frame,offset)`
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/fc/d5/fcd5ca3aeea5896f35db18a9c30c9976_800x513.png)
1. 页表:使用数据结构,为虚拟内存地址,offset=4表示在页框中的第4块
2. 页框,表示真实内存地址
3. 每块内存的大小为4k
**页表项**
页表的每一项叫做页表项
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/00/de/00de4e141ad12f4786027ec2cb3c9e40_400x102.png)
1. 高速缓存禁止位:允不允许L1、L2、L3等高速缓存缓存页框
2 访问位:有没有被读过
3. 修改位:有没有被写过( dirty )
4. 保护位:可不可以写入
4. 「在不在」位:对应的 Frame目前在不在内存中
- 表示frame在不在真实的内存中
- 如果不在,会进行[缺页中断,]调度程序在去把真实的内存拿出来
## 举例
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/73/8b/738b0939d34cd7471a0e01a9cf7bc22c_800x691.png)
指令:
```
MOV R0 10000
```
将内存地址10000的值拷贝到寄存器R0
答:
找虚拟内存的地址
```
10000/(4*1024)=2 // 表示在页表的第3块,标识从0来时
10000 -2*(4*1024)-1808 // 在第三块的 1808 地址
```
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/0c/e5/0ce5eedb22206911e33d98845ac8f826_250x128.png)
虚拟地址: 00010 表示第三块, 11100010000 表示1808
物理地址: 000110 表示第六块,11100010000 表示1808
问题:每次查找地址都要计算两次
使用内存管理单元( Memory Management Unit),用硬件计算
## 内存管理单元( Memory Management Unit)
- MMU位于CPU内部,可以通过硬件电路完成內存映射
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/38/a5/38a53580ffd5cd9801c1351eec67b574_400x248.png)
处理过程
```
addr -> mmu(addr) ->newAddr
既
(page,x) -> mmu(page,x) -> (frame,x)
```
### 如果工作
- 系统让MMU 把内存页表加载进来
- 虚拟地址通过MMU后被映射成物理地址
- 0-1代表的是存在/不存在,如果虚拟地址页号指向一个**不存在 frame**,那么会触发操作系统的**缺页中断**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/35/9f/359f9dd3fb73081ba4a5e17419818c15_948x934.png)
### MMU中的页表是怎么来的?
- 操作系统告诉MMU页表在内存中的位置→MMU加载页表→MMU会自己利用页表进行地址转换
- CPU对MMU对页表中条目数量大小有限制,有的会有几个M,也可以更大
- 操作系统内核中有负责MMU管理模块
## 缺页中断
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/e7/76/e7763c2208b60a82ab1e3c0d622f9b44_800x543.png)
1. 进程触发缺页中断
2. 内核空间中有专门处理中断的程序调用用户空间的页面调度
3. 页面调度从磁盘中获取相关信息返回给中断处理程序
4. 中断处理程序再映射到 MMU 处理程序
## 多级页表
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/cc/24/cc2473070d27b7b849ec23ba25055a7e_367x400.png)
- MMU先用PT1在顶级页表中查询2级页表在内存中位置
- MMU利用PT2在二级页表中查询 frame的值
- MMU根据 frame的值将虚拟地址映射到物理地址
多级页表能省空间吗?
- 如果只有1级,比如4G/4kb的情况需要1M的页表条目
- 如果2级顶级页表需要1k条目每个二级页表需要1k条目,一共需要1k个二级页表(这是不是说明多级页表并没有节省空间?)
- 多级页表是个跳跃结构,因为进程不会把所有的4G内存都占满,于是节省了空间。
### 块表 (加速MMU读写)
块表,小型硬件设备——也叫转换检测缓冲区( Translation Lookaside Buffer),可以加速MMU的读写
块表内部
| 有效 | Page | 修改位 | 保护位 | Frame |
| --- | ---| --- | --- | ---|
| 1 | 100 | 1 | RW | 66 |
| 1 | 150 | 1 | R | 44 |
第一次MMU 后,会把值存入块表内部,后期调用如果命中,则实现加速
';