• 沒有找到結果。

虚拟存储器的概念如前所述,它是在存储体系层次结构基础上,由操作系统的存储管理软件 对内存和外存进行统一管理,将内存和外存统一编址,形成一个比内存空间大得多的虚拟存储空 间。虚拟地址空间的大小取决于 CPU 所采用的存储器管理机制,并由一个大容量的快速硬盘或光 盘存储器支持。虚拟存储器的地址称为虚拟地址或逻辑地址。在采用虚拟存储器技术的系统中,

用户编程时使用逻辑地址,这使得用户编写程序时可以不考虑内存空间大小的限制在虚拟空间内 自由编程。运行时首先由操作系统将需要执行的部分程序调入内存,其余部分则仍留在外存上,

此后需要执行的程序段不在内存时,由操作系统动态地进行调入和调出,从而实现在具有小内存 空间的系统中运行大容量的程序。

由于用户编程使用的是逻辑地址,而 CPU 能访问的是物理存储器地址,所以实现虚拟存储器 的关键是自动而快速地实现虚拟地址向物理地址的变换,通常也称为地址映像或程序定位。目前 普遍采用的地址映像都是使用驻留在存储器中的各种表格,规定各自的转换函数,在程序执行过 程中动态地完成地址变换。具体采用何种地址映像方法取决于虚拟存储器的管理策略,常用的虚 拟存储管理有以下三种:

z 页式管理。页式管理的基本原理是将虚拟存储空间和内存空间划分成固定大小的若干页,

并为每个页按顺序指定一个页号。然后以页为单位来分配、管理和保护内存,每个任务 或进程对应一个页表,保存在内存中。CPU 访问某个页时,通过页表将虚拟页号转换为 物理页号,从而实现虚拟地址到物理地址的变换;若该页不在内存,就需要由操作系统 的存储管理软件按一定的算法淘汰和调页。

z 段式管理。段式管理是以虚拟存储器和内存的分段来作为内存分配、管理和保护的基础。

段的大小取决于程序的逻辑结构,每个任务或进程对应一个段表驻留在内存中,用于记 录段的有关信息,如段号、段基址、段长度和段装入等。CPU 通过访问段表,判断该段 是否已调入内存,并完成虚拟地址到物理地址的变换。

z 段页式管理。这种管理策略是综合页式和段式管理的优点而产生的一种折中方法。它首 先将程序按其逻辑结构划分为若干个大小不等的逻辑段,然后再将每个逻辑段划分为若 干个大小相等的逻辑页;主存空间也划分为若干个同样大小的物理页。每个任务或进程 对应一个段表,每段则对应有自己的页表,系统以页为单位进行地址映像。

目前各种 16 位、32 位微机系统中,大多采用了虚拟存储器技术。下面以 Pentium 微处理器为 例,详细介绍 Pentium 的分段分页管理机制,以及虚拟地址向物理地址转换的原理。

4.7.1 分段分页管理机制

Pentium 的虚拟存储器管理与 80386/80486 基本相同,采用分段分页管理策略。分段分页管理 的基本思想如前所述:首先将虚拟地址空间分成若干个大小不等的逻辑段,逻辑地址由间接指向 段基址的 16 位段选择符和 32 位段内偏移量两部分组成,并由分段机制将 48 位逻辑地址转换为 32 位线性地址。然后再将线性地址空间等分为固定大小的若干页,将线性地址用页基址和页内偏 移量表示,以页为单位进行地址映射,并由分页机制将 32 位线性地址转换为 32 位物理地址。这 种分段分页机制的原理示意如图 4.39 所示。

图 4.39 80486/Pentium 的分段分页机制示意图

虚拟地址空间是二维的,它所包含的段数最大可到 16K 个(由 GDT 和 LDT 定义),每个段最 大可到 4GB(分段分页时,只分段时为 1MB),从而构成 16K×4GB=64TB 容量的庞大虚拟地址空 间。线性地址空间和物理地址空间都是一维的,容量为 232=4GB。

分段机制是 Pentium 虚拟存储管理的基础,而分页机制则是可选的。当控制寄存器 CR0的 PG 位为 0 时,分页机制被禁止,这时分段机制产生的线性地址即是物理地址。

4.7.2 虚拟地址向实地址的转换原理

Pentium 的分段和分页部件支持段式、页式和段页式三种虚拟存储管理策略。其虚拟地址向实 地址的转换首先由分段机制将虚拟地址转换为线性地址,分页时再由分页机制将线性地址转换为 物理地址。

1.虚拟地址向线性地址的转换

Pentium 的虚拟地址由 16 位段选择符和 32 位偏移量两部分构成。段选择符由 CS、SS、DS、

ES、FS 和 GS 六个段寄存器提供,32 位偏移量由指令中的寻址方式给出。在分段机制中,每个逻 辑段都由三个参数定义:

z 段的基址。它是线性空间中段的开始地址。

z 段的界限。是指段内可以使用的最大偏移量,它指明该段的长度。

z 段的属性。如可读出或写入段的特权级等。

以上三个参数存储在段的描述符中。所有任务所共享的段的描述符组织在一起构成全局描述 符表 GDT,而每个任务所私有的段的描述符则存放在各自的局部描述符表 LDT 中。将虚拟地址 转换成线性地址是根据驻留在内存中的全局描述符表 GDT 和局部描述符表 LDT 进行转换的,转 换原理如图 4.40 所示。

图 4.40 虚拟地址向线性地址的转换 段选择符 偏移地址

15 0 31 0

虚拟地址

31 0

线性地址

31 0

物理地址

:

CR0的 PG 0

1

段选择符 偏移量

15 …… 3 31 0 虚拟地址

线性地址 2 1 0

描述符

表基址 31 0

:

13 位索引

RPL TI

段描述符 GDT/LDT

63 0

……

GDTR 或 LDTR

32 位 + + 段基址

乘 8

由段选择符中的表指示符 TI 找到段描述符所在的描述符表 GDT/LDT,再由描述符索引字段 乘 8 计算出段描述符相对于 GDT/LDT 表基址的偏移量,找到该段对应的描述符,描述符中 32 位 段基址加上 32 位段内偏移量即得 32 位线性地址。

2.线性地址向物理地址的转换

Pentium 采用段式管理,即未启用分页机制(CR0中的 PG 位等于 0)时,分段机制产生的线 性地址即为物理地址;采用段页式管理,即同时启用分段分页机制时,段部件产生的线性地址空 间被划分成大小固定的页,由分页机制把线性地址空间中的任一页映射到物理空间的一页,将线 性地址转换成物理地址。

与 80486 不同的是,Pentium 除支持 4KB 分页外,还支持 4MB 分页。新的 4MB 页由控制寄 存器 CR4的 PSE 位选择。无论 4KB 分页还是 4MB 分页,将线性地址转换成物理地址都是由驻留 在内存中的页表来完成的。

(1)4KB 分页时的地址变换

Pentium 的 4KB 分页与 80386/80486 的分页机制相同,为节省页表所占用的内存空间,也是 采用两级页表机构:第一级页表由 210个表项构成页目录表,每项 4 个字节,占 4KB 内存,其物 理基址由 CR3控制寄存器提供;第二级也是由 210个表项构成页表,每项 4 个字节,占 4KB 内存。

这样,两级页表组合起来只占 8KB 内存,即可描述 220个表项。这种分页机制的转换原理如图 4.41 所示。

图 4.41 线性地址到物理地址的转换

为了与两级页表机构相适应,将 32 位线性地址分成页目录索引(10 位)、页表项索引(10 位)

和页内偏移地址(12 位)三个字段。由页目录索引乘 4 计算出页目录项相对于页目录的偏移量,

找到该页对应的页表的首地址(页目录项),再用页表项索引乘 4 计算出页表项相对于页表的偏移 量访问页表,即可找到与线性地址相对应的物理地址所在页的页基址(低 12 位为 0),页基址与 页内偏移量相加即为物理地址。

例 4.6 假定 CR3中值为 00000000H;访问页组前,内存中已有 3 页被访问过并已定位;访问 此页前,内存已有 40 页被定位。设线性地址为 01234567H,试通过页目录表和页表将其转换为物 理地址。

将线性地址 01234567H 分解为页目录索引、页表项索引和页内偏移地址的形式如下:

CR3 根地址

31 22 21

线性地址

+

页表项索引 页内偏移量

页目录索引

页 目 录

页表项 页基址 页 表

页目录项 +

+

页表基址

物理 地址

… …

… … …

1 页 物理存储器

12 11 0

10 10 12

31 0

31 0 乘 4

乘 4

31 22 21 12 11 0 0000 0001 00 10 0011 0100 0101 0110 0111 页目录索引 页表项索引 偏移量 则通过两级页表进行物理地址变换的过程如图 4.42 所示。

图 4.42 线性地址到物理地址的转换

第一步:根据页目录索引和 CR3给出的页目录基址计算出页目录项的物理地址:

页目录项物理地址=CR3中基址+页目录索引×4=00000010H 以该地址从页目录表中取出页表基址为:00003000H

第二步:根据页表项索引和得到的页表基址计算出页表项的物理地址:

页表项物理地址=0000300H+234H×4=000038D0H 以该地址从页表中取出页基址为:00028000H

由此得到物理地址为:

物理地址=页基址+页内偏移量=00028000H+567H=00028567H

(2)4MB 分页时的地址变换

Pentium 采用 4MB 分页时,只需要单一的一个页表,从而大大地减少了内存用量。图 4.43 给 出了线性地址 00400002H 在 4MB 页中定位的转换过程。由页目录索引乘 4 计算出页目录项相对 于页目录的偏移量,访问一级页目录表,即可找到与线性地址相对应的物理地址所在页的页基址

(低 22 位为 0),页基址与页内偏移量相加即为物理地址。

3.转换后援缓冲器 TLB

Pentium 使用 4KB 分页时,采用两级页表机构节省了内存,但处理器进行地址变换时,需访 问两级页表,从而降低了地址变换速度。为解决这一问题,Pentium 微处理器与 80486 一样,在页 部件中设置了一个转换后援缓冲器 TLB。TLB 是一个可容纳 32 个页表项的高速缓存,它存放着 最近访问过的 32 个页面所对应的页表项。

TLB 由两个字段组成:标记字段存放线性地址对应的虚页号;页表数据字段则存放着该页面 对应的页表项(页基址的高 20 位)。页部件将线性地址变换为物理地址时,用虚页号同时在二级

TLB 由两个字段组成:标记字段存放线性地址对应的虚页号;页表数据字段则存放着该页面 对应的页表项(页基址的高 20 位)。页部件将线性地址变换为物理地址时,用虚页号同时在二级

相關文件