内存管理:虚拟内存

本文介绍了虚拟内存的基本思想,包括虚拟地址、分页机制、缺页中断、内存管理单元(MMU)及其工作原理,以及页表和转换检测缓冲区(TLB)在加速分页过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟内存基本思想

每个进程拥有自己的 地址空间,该空间被分割成多个块,每一块称作 一页(page),每一页有连续的地址范围。这些页被映射到物理内存,但并不是进程所有的页都必须在内存中才能运行。当进程引用到一部分在物理内存中的页时,就由硬件立刻执行映射。当引用到不在物理内存中的页时,则由操作系统负责将缺失的页装入物理内存并重新执行失败的指令。

虚拟地址(Virtual Address)

由程序产生的这些地址称为虚拟地址(逻辑地址),分成 页号(高位部分)偏移量(地位部分) 两部分。它们构成了一个 虚拟地址空间(Virtual Address Space)。虚拟地址不会直接送到内存总线上,而是先被送到 内存管理单元(Memory Management Unit),MMU 把虚拟地址映射为物理内存地址。

分页(Paging)

虚拟地址空间按照固定大小划分成被称为 页面(page) 的若干单元,在物理内存中对应的单元称为 页框(Page Frame)。RAM 和磁盘之间的交换总是以页面为最小单元进行的。许多处理器支持对不同大小的页面混合使用和匹配。如 x86-64 架构的处理器支持 4KB、2MB 和 1GB 大小的页面。可以将一组 4KB 大小的页面用于用户程序,将一个 1GB 大小的页面用于内核程序。

缺页中断

当程序访问到一个未被映射的页面,会使 CPU 陷入到操作系统内核(需要调用内核函数来完成内存和磁盘之间的数据交换),这个陷阱称为缺页中断。操作系统会根据页面置换算法选择一个合适的页框并将其内容写入磁盘,随后把需要访问的页面读到刚才回收的页框中,修改映射关系,然后重启引起缺页中断的指令。

内存管理单元(MMU)

虚拟地址不会直接被送到内存总线,而是先送入 MMU。MMU 负责将被送入的合法虚拟地址转换成物理地址后输出。

页表

页表的结构: 页表由若干个页表项组成,页表项的结构是和机器密切相关的,但不同机器的页表项存储的信息都大致相同,32 位是一个常用大小。下面列举一些常用的域:

  • 页框号:代表逻辑地址所在的页面在物理内存中对应的页框。
  • “在/不在”位:用以标识该页是否已被写入内存。
  • 保护位:指出这个页的访问权限读、写权限)。
  • 修改(modified)位:对某页进行写入操作时由硬件自动设置修改位。如果操作系统回收该页对应的页框时,如果修改位被置 1,则表示是脏的(被修改过),需要写回磁盘再回收。反之则是干净的,直接回收即可。
  • 访问(referenced)位:只要页面被访问,系统就会设置该页面的访问位。通常用来配合页面置换算法使用。
  • 高速缓存禁止位:用于禁止该页面被高速缓存。对于哪些映射到设备寄存器而不是常规内存的页面而言,这个特性是十分重要的,他能保证是不断地从设备中读取数据而不是访问一个旧的高速缓存副本。(具有独立的 I/O 空间而不是用内存映射 I/O 的机器不需要这一位)
MMU 工作实例

虚拟地址 8196(对应二进制:0010000000000100)用下图所示的 MMU 映射机制进行映射,输入的 16 位虚拟地址中高四位代表页号,低 12 位为偏移量。4 位页号可以表示 16 个页面,而 12 位偏移量使得每个页面可以对 4096 个地址进行编址,通常一个地址对应一个大小为 1 个字节的内存单元,则本例中一个页面大小位 4096 个字节。将页号作为页表的索引,以查找页表中该页面对应的页框号。如果“在/不在”位是 0,则引发缺页中断。如果该位是 1,则将页表中查到的页框号复制到输出寄存器的高 3 位中,再加上输入虚拟地址中的低 12 位偏移量,如此就构成了 15 位的物理地址,该得到的物理地址送到内存总线即可完成寻址工作。

在这里插入图片描述

加速分页过程

转换检测缓冲区(Translation Lookaside Buffer,TLB): 简称快表,由于访问页表需要额外的一次内存访问,故提出在计算机中设置一个小型硬件设备,将虚拟地址直接映射到物理地址,而不必再访问页表。这种设备称为转换检测缓冲区或快表。它通常在 MMU 中,包含少量最近常访问的页面信息。

工作流程: 将一个虚拟地址送入 MMU 时,首先在 TLB 中进行匹配。如果发现了一个有效的匹配并且要进行的访问操作并不违反保护位,则将页框号直接从 TLB 中取出而不必访问页表;如果虚拟页号确实在 TLB 中,但是指令试图在一个只读页面上进行写操作,则产生一个保护错误;如果虚拟页号不在 TLB 中,就会查询页表。接着从 TLB 中淘汰一个表项,然后用新找到的页表项代替。当一个表项被清除出 TLB 时,将修改位复制到内存中对应的页表项。当页表项从页表中状态 TLB 时,所有值都来自内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值