一、段式虚拟存储器的定义
段式虚拟存储器将内存划分为多个段,每个段包含了一组逻辑上相关的地址。段的大小可以不同,由程序的逻辑结构决定。每个程序可以包含多个相同类型的段,如代码段、数据段等。
二、段表的设计
为了实现段式虚拟存储,需要设计一个段表来记录每个段的信息。段表通常包含以下字段:
段号:用于唯一标识一个段。 段长:记录该段的实际长度,用于检查访问是否越界。 基址:该段在主存中的起始地址,也称为段起点。 装入位:指明该段是否已经调入实存。 其他信息:如段的访问权限、是否被修改过等。
三、地址变换过程
当CPU需要访问某个虚拟地址时,会首先通过段表找到对应的段,然后根据段内的偏移量计算出实际的物理地址。具体过程如下:
提取段号和偏移量:从虚拟地址中提取出段号和段内偏移量。 查找段表:根据段号在段表中查找对应的段表项。 检查装入位:判断该段是否已经调入实存。如果装入位为0,表示该段未调入实存,需要产生缺段中断,由操作系统负责将该段调入实存;如果装入位为1,表示该段已调入实存,继续下一步。 计算物理地址:将段表中的基址与段内偏移量相加,得到实际的物理地址。 检查越界:根据段长判断访问是否越界。如果访问地址超出了段的长度,需要产生越界中断。
四、示例
假设有一个程序包含两个段:代码段和数据段。代码段的段号为0,长度为1024字节,基址为0x1000;数据段的段号为1,长度为512字节,基址为0x2000。现在CPU需要访问虚拟地址(0, 500),即代码段的偏移量为500的地址。
提取段号和偏移量:段号为0,偏移量为500。 查找段表:在段表中查找段号为0的段表项,得到基址为0x1000,段长为1024字节。 检查装入位:假设装入位为1,表示代码段已调入实存。 计算物理地址:将基址0x1000与偏移量500相加,得到物理地址为0x1500(即十进制的5376)。 检查越界:由于500小于段长1024,访问未越界。