ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 只有 32Kb 内存,如果抽象出64Kb内幕才能让进程使用 1. 将内存分成很多小块,进程可以使用离散的小块 2. 解决进程轮流使用内存( Swapping小块) ## 虚拟地址空间(页表) - 程序运行在虚拟地址空间,遇到内存地址就映射到物理空间。 `(page,offset) = (frame,offset)` ![](https://img.kancloud.cn/fc/d5/fcd5ca3aeea5896f35db18a9c30c9976_800x513.png) 1. 页表:使用数据结构,为虚拟内存地址,offset=4表示在页框中的第4块 2. 页框,表示真实内存地址 3. 每块内存的大小为4k **页表项** 页表的每一项叫做页表项 ![](https://img.kancloud.cn/00/de/00de4e141ad12f4786027ec2cb3c9e40_400x102.png) 1. 高速缓存禁止位:允不允许L1、L2、L3等高速缓存缓存页框 2 访问位:有没有被读过 3. 修改位:有没有被写过( dirty ) 4. 保护位:可不可以写入 4. 「在不在」位:对应的 Frame目前在不在内存中 - 表示frame在不在真实的内存中 - 如果不在,会进行[缺页中断,]调度程序在去把真实的内存拿出来 ## 举例 ![](https://img.kancloud.cn/73/8b/738b0939d34cd7471a0e01a9cf7bc22c_800x691.png) 指令: ``` MOV R0 10000 ``` 将内存地址10000的值拷贝到寄存器R0 答: 找虚拟内存的地址 ``` 10000/(4*1024)=2 // 表示在页表的第3块,标识从0来时 10000 -2*(4*1024)-1808 // 在第三块的 1808 地址 ``` ![](https://img.kancloud.cn/0c/e5/0ce5eedb22206911e33d98845ac8f826_250x128.png) 虚拟地址: 00010 表示第三块, 11100010000 表示1808 物理地址: 000110 表示第六块,11100010000 表示1808 问题:每次查找地址都要计算两次 使用内存管理单元( Memory Management Unit),用硬件计算 ## 内存管理单元( Memory Management Unit) - MMU位于CPU内部,可以通过硬件电路完成內存映射 ![](https://img.kancloud.cn/38/a5/38a53580ffd5cd9801c1351eec67b574_400x248.png) 处理过程 ``` addr -> mmu(addr) ->newAddr 既 (page,x) -> mmu(page,x) -> (frame,x) ``` ### 如果工作 - 系统让MMU 把内存页表加载进来 - 虚拟地址通过MMU后被映射成物理地址 - 0-1代表的是存在/不存在,如果虚拟地址页号指向一个**不存在 frame**,那么会触发操作系统的**缺页中断** ![](https://img.kancloud.cn/35/9f/359f9dd3fb73081ba4a5e17419818c15_948x934.png) ### MMU中的页表是怎么来的? - 操作系统告诉MMU页表在内存中的位置→MMU加载页表→MMU会自己利用页表进行地址转换 - CPU对MMU对页表中条目数量大小有限制,有的会有几个M,也可以更大 - 操作系统内核中有负责MMU管理模块 ## 缺页中断 ![](https://img.kancloud.cn/e7/76/e7763c2208b60a82ab1e3c0d622f9b44_800x543.png) 1. 进程触发缺页中断 2. 内核空间中有专门处理中断的程序调用用户空间的页面调度 3. 页面调度从磁盘中获取相关信息返回给中断处理程序 4. 中断处理程序再映射到 MMU 处理程序 ## 多级页表 ![](https://img.kancloud.cn/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 后,会把值存入块表内部,后期调用如果命中,则实现加速