Chinaunix首页 | 论坛 | 博客
  • 博客访问: 240984
  • 博文数量: 41
  • 博客积分: 928
  • 博客等级: 准尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-01 10:07
文章分类
文章存档

2011年(41)

分类: 嵌入式

2011-07-02 21:26:45

在采用分页式管理的机器中,主存和虚存都划分成固定大小的块——页,主存的页称为实页,虚存的页称为虚页,实页和虚页的大小是相同的。这样的话,实地址和虚地址都由两部分组成,分别为实页号/虚页号和页内偏移地址,如下所示。

对于CPU访问的某一个字单元来说,实地址中的实页号和虚地址中的虚页号是不同的,但两个地址中的页偏移是相同的。
在 分页式虚拟存储器中,任一个虚页可以映射到主存的任一个实页上,虚地址到实地址的变换是通过存放在主存中的页表来实现的。页表由一个个页表项组成,每个虚 页在页表中占一个页表项,并按虚页号的顺序排列。页表项的内容主要包括该虚页所在主存的实页号和一些控制信息,如图4-36所示。其中
F:装入位。F=1表示该虚页已装入到主存中;F=0表示该虚页还没装入主存。
C:修改位。用于表示该页装入主存后是否被修改过。
RW:访问方式字段。用于表示该页可以允许以“读-写-执行”方式中的哪些方式访问。
页表在主存中的位置通过一个页表基址寄存器来指明,页表项的内容是在每个虚页装入主存时填写的。

图4-36 分页式虚拟存储器地址变换

由于页面的划分只是机械地对虚、实存空间进行等分,因此,页面失效有可能发生在一条指令的执行过程之中。例如,对于按字节编址的存贮器,就可能出现一条指 令跨页存贮的情况。当前一页已在主存,而后一页不在主存时,则在取指令过程中就会发生页面失效。同理,在取操作数 (特别是字符串)、间接寻址及写回结果的过程中都可能发生页面失效。对于这种故障,处理机必须立即响应和处理,否则该条指令无法执行下去。如何保存和恢复 故障点的现场,使得故障处理完成后,又能正确地从断点处继续执行指令,这是保证虚拟存贮器能否正确工作的关键性问题之一。

目前,有的机器 是采用后援寄存器技术,即把该条指令的故障现场全部保存下来,当处理完该故障,把所需要的页调入主存后,再从故障点处继续执行完该条指令。有的机器则是保 存部分有关现场,使该指令能从头再开始执行。有的机器则采用预判技术。例如,在执行字符串指令前,预判字符串的首、尾字符所在页是否已在主存中,如果在, 则执行这条指令,只要有一个还没装入主存,就产生页面失效故障请求,在把该页调入后,才开始执行这条字符串指令。
当用户程序中给出一个访存虚地址 时,系统首先以页表基址寄存器中的内容为基地址,虚地址中的虚页号为偏移量,找到该虚地址所对应的存放在主存中的页表的页表项。然后根据装入位F的状态判 断该虚页是否已经装入主存。若已装入,则从该页表项中取出实页号,再结合页内偏移地址一道共同形成一个访主存的物理地址。若未装入,则产生页面失效(故 障),启动输入输出子系统,将该虚地址所在的页从辅存中调入主存。

在页面失效时,要求把该页由辅存调入主存,因此必须给出该页在辅存的物理地址。辅存一般是按信息块(对磁盘而言为扇区)编址,且一个块的大小通常等于一个页面的大小。对磁盘存储器来说,其物理地址格式如下:

将虚地址变换成磁盘的物理地址时,即是把虚页号变换成某个磁盘机上的某个扇区号。为此,需有一个虚页号与辅存物理地址的映象表,该表称为外页表(相对应的 前述页表称为内页表)。图4-37示出了外页表的结构。它也按虚页号的顺序排列,每个虚页在外页表中占有一项,记录该页在辅存中的物理地址。外页表的内容 是在把程序装入辅存时填写的。其中M为装入位。

通常外页表是存在辅存中。当某个程序初始运行时,就把外页表的内容抄录到已建立的内页表的实页号字段中。在进行虚地址到实地址变换时,若出现页面失效,从内页表的实页号字段中取出的正是辅存物理地址。而当该页调入主存后,其实页号字段被真正填入所在主存的实际页号。

图4-37 外页表结构

由于虚拟存贮器的页面失效概率较低,一般不到1%。因此,由虚地址变换成辅存物理地址完全可由软件实现,而不必提供专用的硬件支持。页面失效时,由于访问 辅存需经机械动作,速度较低,因而不是让处理机空等着该页由辅存调入主存,而是切换到其它已准备就绪的任务(进程),把调页工作交由I/O处理机即通道来 完成。虽然,任务(进程)切换一般需要执行几百甚至几千条指令,但比起调页来说,耗费的时间毕竟要小得多。

虽然页表是实现分页式虚拟存储器的关键,但我们同时注意到,在页式虚拟存贮器中,每次访存都要增加一个查页表的过程,而页表是存放在主存中的,这就相当于 每次多增加了一次访主存的操作。如果这个查页表的操作时间不能缩短,虚拟存贮器是没有实用价值的。因此,如何加快地址变换速度,就成为提高虚拟存贮器速度 的另一个关键问题,一种较好的解决办法是采用所谓“快表”的方法。

仔细分析实际查表的过程可以发现,由于程序局部性的特点,对页表内各页表项的使用不是随机的,而是簇聚的,即在某一段时间内,实际上只用到页表中很少的几 个页表项。因此,我们可以单独采用快速硬件,实现只含有部分页表项的地址映象变换表,称这种用快速硬件实现的部分页表为转换旁视缓冲器 TLB(TranslatimLookaside Buffer),又称快表,而相对地把原来的页表称为慢表。快表比慢表小得多,其内容只是慢表的一个小的副本。

快表可用相联存贮器实现,其中的各页表项含有最近访问的虚页号及其对应的主存实页号。图4-38给出了使用快慢表结合进行地址变换的过程。

图4-38 快慢表结合实现虚地址变换

首先按虚地址中的虚页号同时到快表和慢表中进行查找。在快表中采用的是相联比较(按内容访问),若该虚页号已在快表中,则可以直接从对应的项中取出实页 号,与虚地址中的页内偏移地址一道共同形成访主存的实地址,并同时使查慢表的操作作废。若该虚页号不在快表中,则在慢表中继续查找,一方面通过慢表继续完 成虚地址的转换工作,另一方面将找到的虚页号和对应的实页号同时存入快表中。

由上可见,快表和慢表又构成了一个表层次。如果快表的命中率相当高,则使地址变换所需时间接近于快表。
阅读(1916) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~