虚拟内存寻址

virtual memory addressing

Posted by Gu on 2022-07-01
Estimated Reading Time 3 Minutes
Words 1k In Total

​ 在计算机早期阶段时候(比如使用DOS系统甚至更早),内存很小一般以KB为单位。那时候程序并不大,内存可以容纳。工程师对内存直接进行物理寻址,即程序中所用的地址是可以直接送进地址总线进行内存寻址的,地址与内存单元对应。

​ 后来程序的规模不断增加,程序对内存的需求超过了内存的实际容量,例如4KB的内存,但是程序的大小为8KB。工程师将程序分段,先将需要运行的一段载入内存,等到需要另一段的时候,再将另一段换入。早期采取覆盖的方式,需要工程师手动分割程序。后来,操作系统完成这一任务,将程序分段,并在需要的时候,将内存中的段换出,再将新的段换入内存。后来,这种超过内存实际寻址空间的虚拟地址空间得以广泛使用。工程师抽象出虚拟内存,每个程序都有其独有的虚拟地址空间。

例子:在一个CPU位数为32位、内存为256MB的机器上,采用按字节寻址,可寻址地址范围为:0x00000000~0xFFFFFFFF(4GB),但其实际内存却只有256MB。因此需要将可寻址的地址(虚拟地址)转换为内存中实际的地址(物理地址),这一任务由MMU(内存管理单元)完成,内存管理单元接收虚拟地址,并转换成物理地址,送入地址总线,以待读写内存数据。

物理地址

​ CPU地址总线传来的地址,可对内存寻址。物理地址空间中绝大部分是映射到内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS、设备控制器的端口)。在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。

虚拟地址

​ 操作系统加载可执行文件后,创建了一个进程,这个进程就有了自己的虚拟地址空间,每个进程的虚拟地址空间都一样,如下图所示:

image-20221204194130578

​ 在采用段页机制的系统中,由逻辑地址转换得到的线性地址不是物理地址,而是虚拟地址,需要进一步的查找页表,最终生成物理地址。

逻辑地址

​ 逻辑是在指有地址变换功能的计算机中,访内指令给出的地址 (操作数) ,也叫相对地址。要经过寻址方式的计算或变换才得到映射内存中的物理地址。

​ 一个逻辑地址由两部份组成,段标识符: 段内偏移量(段内偏移量在采取段页机制的机器中,由页号:页内偏移量组成)。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是个索引号,后面3位包含一些硬件细节 。
image-20221204192726380

线性地址

​ 线性地址,是逻辑地址到物理地址变换之间的中间层。**在分段部件中逻辑地址包含段中的偏移地址,然后加上基地址就是线性地址(若采用段页机制,则该线性地址为虚拟地址,需进一步转换)。**线性地址通常用十六进制数字表示,程序代码会产生逻辑地址,通过逻辑地址变换就可以生成一个线性地址。如果启用了分页机制(见上图),那么线性地址可以再经过变换以产生一个物理地址。如果没有启用分页机制,那么线性地址直接就是物理地址。
image-20221204192410070


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !