深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)

时间:2022-04-05 04:50:34

参照
《深入理解计算机系统》
《深入理解linux内核》
《80x86汇编语言程序设计》
《操作系统的设计与实现》

为了对存储器中的程序及数据实现保护和共享硬件支持,为了对实现虚拟存储器提供硬件支持,现代的CPU不仅采用了扩充的存储器段式管理机制,而且还提供了可选的存储器分页管理机制。

物理地址(physical address)


用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。

这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。

所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。

分段机制与逻辑地址(logical address)


Intel为了兼容,将远古时代的段式内存管理方式保留了下来。

逻辑地址指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址。

Intel中段式管理中,对逻辑地址要求,“一个逻辑地址,是由一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标识符:段内偏移量]

用分段方法来分配和管理虚拟存储器。把任务的地址空间分成若干段,而每一段有自己的段名和段大小。任务所使用的每一个地址空间都抽象为段基址:段偏移的格式,极大的方便了程序的编写和调试。
段式管理是x86架构下的内存管理方式,一直延续到现在。x86架构主要厂家intel、威盛和AMD.就是运行windows xp的pc机使用的处理器。

操作系统有实模式和保护模式两种,比如以前使用单片机那就是实模式,申请的地址就是实际的物理地址,寻址空间有限。而保护模式可以扩展到4G的虚拟地址,所以现在的操作系统都是运行在保护模式下的。

在x86架构下的系统,必须先将段管理的逻辑地址转换为虚拟地址,再将虚拟地址转换为物理地址(如果打开了分页管理的话)。而arm架构是没有分段管理的,所以直接将虚拟地址转换为物理地址。

分页机制与线性地址(linear address)


线性地址(linear address)或也叫虚拟地址(virtual address),跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址则对应了硬件页式内存的转换前地址。

用分页方法来分配和管理实存。即把整个主存分成大小相等的存储块,可装入作业的任何一页。
这样分配内存时,操作系统以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。

“页”,我们称之为物理页,或者是页框、页桢的。是分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与内存页是一一对应的。
1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。万里长征就从此长始了。
2、每一个活动的进程,因为都有其独立的对应的虚似内存(页目录也是唯一的),那么它也对应了一个独立的页目录地址。——运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。
3、每一个32位的线性地址被划分为三部份,面目录索引(10位):页表索引(10位):偏移(12位)
依据以下步骤进行转换:
1、从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
2、根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
3、根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
4、将页的起始地址与线性地址中最后12位相加,得到最终我们想要的葫芦;

地址空间和地址转换


虚拟存储器由大小可变的存储块(段)构成。实模式下直接由段基址:段偏移来得到虚拟地址。而保护模式下,CPU采用称为段描述符的数据来描述段的地址,大小和属性信息以及使用情况。虚拟存储器的地址(逻辑地址)由指示描述符的段选择子和段内偏移两部分构成,这样的地址合成为虚拟地址空间。

例如,通过这种转换,80386支持的虚拟控件就达到64T字节。程序员编写程序时使用的存储地址空间是虚拟地址空间。因此我们可以认为有64T的存储空间可供使用。

显然,只有在物理存储器的程序才能够被执行,也只有物理存储器中的数据才可以被访问。因此,虚拟地址空间必须被映射到物理地址空间,二维的虚拟必须被转换成一维的物理地址。而由于物理地址空间远小于虚拟地址空间。所以只有虚拟地址空间的部分可以映射到物理地址空间。由于物理存储器的大小远小于物理地址的空间,所以只有上述部分中的部分才能真正映射到物理存储器。

每一个任务都有一个虚拟地址空间。为了避免多个并行任务的多个虚拟地址空间直接映射到同一物理地址空间,采用线性地址空间来隔离虚拟地址空间和物理地址空间。
线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。

因此将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址,CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。

深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)

通过描述符表和描述符,分段管理机制实现了虚拟地址到线性地址的映射。完成了把二维的虚拟地址转换为一维的线性地址。这一步总是存在的。

分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称为页。通过在线性地址空间的页和物理地址空间的页之间建立的映射表,分页管理机制实现了线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就直接等同于物理地址空间,线性地址直接等于物理地址。

分段管理机制所使用的可变大小的块,使分段管理机制比较适宜处理复杂系统的逻辑分段。存储块的大小可以根据适当的逻辑含义进行定义,而不用考虑可大小的页所强加的人为限制。每个段可作为独立的单位进行处理,以简化段的保护和共享。分页机制所使用的固定大小的块最适合管理物理存储器。无论是管理内存还是外存都同样有效,分页管理机制能够有效的支持虚拟存储器(虚拟内存)