3.2.2 地址的映象与变换
在虚拟存储器中有三个地址空间,一是虚拟地址空间,也称虚存空间或虚拟存储器空间,它是应用程序员用来编写程序的地址空间,这个地址空间非常大。二是主存储器的地址空间,也称主存地址空间、主存物理空间或实存地址空间,第三个是辅存地址空间,也就是磁盘存储器的地址空间。与这三个地址空间相对应,有三种地址,即虚拟地址(虚存地址、虚地址)、主存地址(主存实地址、主存物理地址、主存储器地址)和磁盘存储器地址(磁盘地址、辅存地址)。
地址映象是把虚拟地址空间映象到主存地址空间,具体地说,就是把用户用虚拟地址编写的程序按照某种规则装入到主存储器中,并建立多用户虚地址与主存实地址之间的对应关系。而地址变换则是在程序被装入主存储器之后,在实际运行时,把多用户虚地址变换成主存实地址(内部地址变换)或磁盘存储器地址(外部地址变换)。
当页表或段表中的有效位指示发生页面失效时,表示需要访问的那一页或那一个程序段还没有装入到主存储器中,这时必须进行外部地址变换。外部地址变换的目的是要找到辅存(磁盘存储器)的实地址,并且把需要访问的那一页或那一个程序段调入到主存储器中。
在操作系统中,通常把页面失效当作一种异常故障来处理。在页式虚拟存储器和段页式虚拟存储器中,由于页面是按固定大小划分的,因此,页面失效可能发生在一条指令的执行过程中。例如,对于按照字节编址的主存储器,有可能出现一条指令跨越页面存放的情况。如果前一页已经在主存储器中,而后一页还没有调入主存储器,则在取指令过程中就可能发生页面失效。同样,在取操作数,特别是取字符串,间接寻址及写回运算结果的过程中都可能发生页面失效。对于这种异常故障,处理机必须立即响应并且处理,否则正在执行的指令无法继续执行下去。
外部地址变换的过程如图3.13所示。由于页面失效的概率非常低,因此,外部地址变换通常用软件来实现。每一个用户程序都有一张外页表,之所以称为外页表是因为它是在外部地址变换中使用的,与在内部地址变换中使用的页表被称为内页表相对应。虚拟地址空间中的每一个页面或每一个程序段,在外页表中都有对应的一个存储字。在每一个存储字中除了必须有磁盘存储器的地址之外,至少还应该包括一个装入位。
由于每一个用户程序有一张外页表,因此,通过多用户虚地址中的用户号U就能够找到该用户程序的外页表起始地址。再通过虚页号P就能唯一确定外页表中与需要访问的页面相对应的那个存储字。如果该存储字中的装入位为"1",则表示要访问的页面已经在磁盘存储器中,否则表示要访问的页面还不在磁盘存储器中,需要从磁带、光盘存储器等海量存储器中调入。
图3.13 外部地址变换
由于虚拟地址空间中的每一个页面在外页表中都要有对应的一个存储字,因此,外页表也要采用前面介绍的多级页表技术。
如果在整个程序的装入和执行过程中,不需要磁带、光盘等海量存储器介入,则外页表页可以与内页表合并成一个页表。当装入位为"1"时,表示要访问的页面已经在主存储器中,这时,页表中的地址字段指出该页在主存储器中的实页号。如果装入位为"0",则表示要访问的页面在磁盘存储器中,这时,页表中的地址字段指出该页存放在磁盘存储器中的磁盘实地址。
根据所采用的地址映象和地址变换方法不同,有多种不同类型的虚拟存储器。目前主要有页式虚拟存储器、段式虚拟存储器和段页式虚拟存储器等三种。然而,这三种虚拟存储器的基本原理、所采用的主要技术和工作流程等是基本相同的。