1、实模式、保护模式2009-06-07 17:18参考了百度百科中关于实模式的讨论:http:/ http:/ X86中的概念。从寻址方式来说,CPU 中的 IP(EIP)中存放虚地址,把虚地址转换到物理地址,各个模式有各自的转换方式。实模式下,虚地址到实地址转换:DS 段寄存器左移 4位与偏移地址相加,得到物理地址,寻址 1M。保护模式下,虚地址到实地址转换经过 MMU(内存管理单元),也就是分段与分页机制,寻址 4G。保护有两层含义:1、任务间保护:多任务操作系统中,一个任务不能破坏另一个任务的代码,这是通过内存分页以及不同任务的内存页映射到不同物理内存上来实现的。2、 任务内保护:系统代码
2、与应用程序代码虽处于同一地址空间,但系统代码具有高优先级,应用程序代码处于低优先级,规定只能高优先级代码访问低优先级代码,这 样杜绝用户代码破坏系统代码。这是通过段式管理来实现,4G 虚拟内存中,代码数据和堆栈各占有一个段,段是一个独立有意义的内存单元,有基地址和边界以及 本段的优先级,windows 系统有两个优先级,Ring0(高优先级)或 Ring3(低优先级),系统代码段和数据段属于 Ring0,不能被用户代码 (Ring3)访问。实模式:16bit的 8086处理器标志着 IntelX86王朝的开始,并且引入了一个重要概念段。8086 处理器地址总线扩展到 20 位,但算术逻辑运算单
3、元(ALU)宽度即数据总线却只有 16位,也就是直接运算的指针长度是 16位的。为支持 1M寻址空间,引入分段的方法。为支持分 段 8086CPU设置四个 16bit段寄存器:CS、DS、SS、ES,对应于地址总线中的高 16位。寻址时,段寄存器*0x10+偏移地址=物理地址。 这样实现 16位内存地址到 20位物理地址的转换,叫“映射”。(之前在想:为什么每个段最大不超过 64K,其实很简单,因为 16位 CPU数据线是 16位的,所以最多只能用一个 16bit数来标识一个偏移量,也就说一个段最大长度是 64K)保护模式:80286处理器地址总线位数增加到 24位,可以访问 16M地址空间。
4、并引入一个新概念保护模式。这种模式下,内存段的访 问受到了限制。访问内存时不能直接从段寄存器获得段起始地址了,而要经过额外转换和检查(从其不能随意存取数据段)。为与过去兼容,80286 内存寻址有 两种方式:保护模式和实模式。系统启动时处理器处于实模式,只能访问 1M内存空间,经过处理可以进入保护模式,可访问 16M内存空间,但要从保护模式回到 实模式必须重启机器。它有个致命缺陷就是 80286虽然扩大了寻址空间,但是每个段大小还是 64K(因为数据线还是 16位的),程序规模仍然受到限制,因 此很快就被 80386代替了。80386是一个 32位的 CPU。它的地址总线和 ALU数据总线都是
5、 32位的。寻址能力达到 4G。理论上说当数据总线和地址总线宽度一致 时,CPU 结构应该简洁明了,但 80386不能做到这点,作为 80X86产品系列的一员,80386 必须维持那些16位段寄存器的存在,必须支持实模式, 同时还要支持保护模式。Intel 选择在段寄存器基础上构筑保护模式,保留 16位段寄存器。在保护模式下,段范围达到 4G。从 80386以后 Intel的 CPU 经历了80486、Pentium、Pentium2、Pentium3 等型号,但都属于同一种系统结构的改进与加强,所以把 80386以后的处理 器统称为 IA32(32 Bit Intel Architectur
6、e)。深入讨论下保护模式:保护模式与实模式中程序运行的实质是一样的,都是“CPU 执行指令,操作相关数据”。最大的变化是“地址转换方式”的变化。这里可以看下两种模式下地址转换方式的区别: 在 ES存入 0x1000,DI 存入0xFFFF实模式:ES:DI = 0x1000 * 0x10 + 0xFFFF = 0x1FFFF,这就是“段基址左移 4位加偏移地址”。保护模式:(注意:0x1000 = 10 0000 0000 0 00 B)ES:DI = GDT 全局描述符表中第 0x200项描述符给出的段基址 + 0xFFFF。为什么是第 0x200项?请看下边段选择子(即段值)的结构。这里
7、ES在两种模式下都不是真正段地址(实模式下称“段寄存器“,保护模式下称“选择子“),都是一种映射,不过映射规则不同而已。保护模式的基本组成:(围绕“地址转换方式”的变化增设了相应机构)1、数据段实模式下的各种代码段、数据段、堆栈段、中断服务程序仍然存在,这里统称为“数据段”。2、描述符保护模式引入描述符类描述各种数据段,描述符为 8个字节(0-7),第 5个字节说明描述符类型,类型不同,描述符的结构也不同。若干描述符集中组成描述符表,描述符表本身也是一种数据段,也使用描述符进行描述。描述符表是一张地址转换函数表。3、选择子保护模式下,逻辑地址由段选择子和段内偏移两部分组成。与实模式相比,保护模
8、式下的段选择子代替了段值。段 选择子有 2个 BYTE。高 13位是描述符索引,第 2位 TI(Table Indicator)是描述符表指示位,TI=0 指示从 GTD(全局描述符表)中读取描述符,TI=1 指示从 LTD(局部描述符表)中读取描述符。低 2位 是 RPL(Request Privilege Level),即进程对段访问的请求权限,具体可以查阅有关资料。这里 80X86系列引入新的寄存器 GDTR和 LDTR。GDTR表示 GDT在内存中的段地址和段界限,GDTR 是一个 48位寄 存器,其中 32位表示段地址,16 位表示段界限(段最大 64K,之前提过描述符表也使用描述符
9、进行描述,因此描述符表最大长度也是 64K,里面最多可存放 64K/8Byte=8K个描述符每个描述符 8Byte。这也是段选择子中描述符索引占 13bit的原因13b=8192)。因为 GDT不能由 GDT本身之内的描述符进行描述定义,所以采用 GDTR为 GDT这一特殊系统段提供一个伪描述符。LDTR表示 LDT在内存中的位置。因为 LDT本身也是一种数据段,它必须有一个描述符存放于 GDT中。因此 LDTR使用与 DS、ES、CS 等相同机制,只存放一个“选择子”,通过查 GDT获得 LDT内存地址。LDTR 类似于段寄存器,由程序员可见的 16bit寄存器和程序员不可见的高速缓冲寄存器
10、组成。在初始化或切换任务过程中,把描述符对应任务 LDT的描述符的选择 子装入 LDTR,处理器根据 LDTR可见部分的选择子从 GDT中取出对应描述符,并把 LDT的基地址、界限和属性等信息保存在 LDTR的不可见高速缓冲寄 存器中。随后对 LDT的访问可根据保存在高速缓冲寄存器中的有关信息进行合法性检查。LDTR包含当前任务的 LDT选择子。所以装入到 LDTR的选择子必须确定一个位于 GDT中类型为 LDT的系统段描述符,即选择子中的 TI=0,且描述符类型字段所表示的类型必须为 LDT。一个多任务操作系统必须有一个 GDT,而每一个正在运行的任务(进程)都有一个 LDT。可以说保护模式
11、的引进才使得 80286以后处理器实现了对 多任务的硬件支持。多任务系统运行中在进程间切换时需要“环境”保护(比如各寄存器值等)。这些“环境”数据构成了一类新的数据段 TSS(任务状态段)。 给TSS段设置描述符(TSS 描述符),并把该类描述符放在 GDT中(自然不能放在LDT中,80x86 也不允许),再加个 TR寄存器用于查表。TR(任 务寄存器)是一个起“选择子”作用的 16bit寄存器。任务切换的工作就是将原任务“环境”存入 TSS,更新 TR,系统将自动查 GDT表获得并装载新任务 的“环境”,然后找到该任务执行。段描述符高速缓冲寄存器:为避免每次存储器访问时,都要访问描述符表获得
12、对应段描述符,从 80286开始每个段寄存器都配有一个高速缓冲寄存器,称为“描述符高速缓冲寄存器”或“描述符投影寄存器”(shadow register),对于程序员不可见。每 当一个选择子装入某个段寄存器,处理器自动从描述符表中取出相应描述符,把描述符中的信息保存到对应高速缓冲寄存器中。此后对该段访问时,处理器都使用对 应高速缓冲寄存器中的描述符信息。段描述符高速缓冲寄存器内保存的描述符信息将一直保存到重新把选择子装入段寄存器时再更新。程序员尽管不可见段描述符高 速缓冲寄存器,但必须注意到它的存在和它的上述更新时机。例如,在改变了描述符表中的某个当前段的描述符后,也要更新对应的段描述符高速缓
13、冲寄存器的内 容,即使段选择子未作改变,这可通过重新装载段寄存器实现。分页:不同程序由不同用户编写,而所有这些程序完全可能使用相同地址空间,而程序切换过程一般不包括内存数据的刷新,因为这么做太浪费。因此引入分页机制才能有效完成对多任务的支持。分 页引入的主要目标就是解决不同进程之间发生地址冲突问题。分页实质就是实现程序内地址到物理地址的映射。用类似 GDT的做法:先建立页表这种数据 段,80x86 中使用二级页表方案,增设一个 CR3寄存器用于存放一级页表(页目录)在内存中的地址,CR3 共 32位,低 12位总为零,高 20位指示页目 录的内存地址,因此页目录总是按页对齐的。CR3 作为进程
14、“环境”的一部分在进程切换时被存入 TSS数据段中。还有一个相应的缺页中断机制及其相关寄存器 CR2(页故障线性地址寄存器)。中断:80x86(保护模式)与 8086(实模式)的中断机制不一样。80x86 系列为中断服务提供中断/陷阱描述符,这些 描述符构成中断描述符表 IDT,并引入一个48bit寄存器 IDTR存放 IDT的内存地址。理论上 IDT表同样可以有 8K项,可是因为 80x86只支持 256 个中断,因此 IDT实际上最大只能有 256项(2K 大小,因为所有描述符都是 8BYTE)。总结可得出,保护模式下增加了:1、寄存器:GDTR、LDTR、IDTR、TR、CR3、CR22
15、、数据段:描述符表(GDT、LDT、IDT)、任务数据段(TSS)、页表(页目录、二级页表)3、机制:权限检测(利用选择子/描述符/页表项的属性位)、线性地址到物理地址的映射=实 模 式 : ( 即 实 地 址 访 问 模 式 ) 它 是 Intel 公 司 80286 及 以 后 的x86(80386,80486 和 80586 等 )兼 容 处 理 器 ( CPU) 的 一 种 操 作 模 式 。实 模 式 被 特 殊 定 义 为 20 位 地 址 内 存 可 访 问 空 间 上 , 这 就 意 味 着 它的 容 量 是 2 的 20 次 幂 ( 1M) 的 可 访 问 内 存 空 间 (
16、 物 理 内 存 和BIOS-ROM) , 软 件 可 通 过 这 些 地 址 直 接 访 问 BIOS 程 序 和 外 围 硬 件 。实 模 式 下 处 理 器 没 有 硬 件 级 的 内 存 保 护 概 念 和 多 道 任 务 的 工 作 模 式 。但 是 为 了 向 下 兼 容 , 所 以 80286 及 以 后 的 x86 系 列 兼 容 处 理 器 仍 然是 开 机 启 动 时 工 作 在 实 模 式 下 。 80186 和 早 期 的 处 理 器 仅 有 一 种 操作 模 式 , 就 是 后 来 我 们 所 定 义 的 实 模 式 。 实 模 式 虽 然 能 访 问 到 1M的 地
17、 址 空 间 , 但 是 由 于 BIOS 的 映 射 作 用 ( 即 BIOS 占 用 了 部 分 空间 地 址 资 源 ) , 所 以 真 正 能 使 用 的 物 理 内 存 空 间 ( 内 存 条 ) , 也 就是 在 640k 到 924k 之 间 。 1M 地 址 空 间 组 成 是 由 16 位 的 段 地 址 和16 位 的 段 内 偏 移 地 址 组 成 的 。 用 公 式 表 示 为 : 物 理 地 址 =左 移 4位 的 段 地 址 +偏 移 地 址 。286 处 理 器 体 系 结 构 引 入 了 地 址 保 护 模 式 的 概 念 , 处 理 器 能 够对 内 存 及
18、一 些 其 他 外 围 设 备 做 硬 件 级 的 保 护 设 置 ( 保 护 设 置 实 质 上就 是 屏 蔽 一 些 地 址 的 访 问 ) 。 使 用 这 些 新 的 特 性 , 然 而 必 不 可 少 一些 额 外 的 在 80186 及 以 前 处 理 器 没 有 的 操 作 规 程 。 自 从 最 初 的x86 微 处 理 器 规 格 以 后 , 它 对 程 序 开 发 完 全 向 下 兼 容 , 80286 芯 片被 制 作 成 启 动 时 继 承 了 以 前 版 本 芯 片 的 特 性 , 工 作 在 实 模 式 下 , 在这 种 模 式 下 实 际 上 是 关 闭 了 新 的
19、 保 护 功 能 特 性 , 因 此 能 使 以 往 的 软件 继 续 工 作 在 新 的 芯 片 下 。 直 到 今 天 , 甚 至 最 新 的 x86 处 理 器 都是 在 计 算 机 加 电 启 动 时 都 是 工 作 在 实 模 式 下 , 它 能 运 行 为 以 前 处 理器 芯 片 写 的 程 序 .DOS 操 作 系 统 ( 例 如 MS-DOS,DR-DOS) 工 作 在 实 模 式 下 , 微 软Windows 早 期 的 版 本 ( 它 本 质 上 是 运 行 在 DOS 上 的 图 形 用 户 界 面 应用 程 序 , 实 际 上 本 身 并 不 是 一 个 操 作 系
20、统 ) 也 是 运 行 在 实 模 式 下 ,直 到 Windows3.0, 它 运 行 期 间 既 有 实 模 式 又 有 保 护 模 式 , 所 以 说 它是 一 种 混 合 模 式 工 作 。 它 的 保 护 模 式 运 行 有 两 种 不 同 意 义 (因 为80286 并 没 有 完 全 地 实 现 80386 及 以 后 的 保 护 模 式 功 能 ):1 “标 准 保 护 模 式 ”: 这 就 是 程 序 运 行 在 保 护 模 式 下 ;2 “虚 拟 保 护 模 式 ( 实 质 上 还 是 实 模 式 , 是 实 模 式 上 模 拟 的保 护 模 式 ) ”: 它 也 使 用
21、32 位 地 址 寻 址 方 式 。 Windows3.1 彻 底 删除 了 对 实 模 式 的 支 持 。 在 80286 处 理 器 芯 片 以 后 , Windows3.1 成为 主 流 操 作 系 统 ( Windows/80286 不 是 主 流 产 品 ) 。 目 前 差 不 多 所有 的 X86 系 列 处 理 器 操 作 系 统 ( Linux, Windows95 and later, OS/2 等 ) 都 是 在 启 动 时 进 行 处 理 器 设 置 而 进 入 保 护 模 式 的 。实 模 式 工 作 机 理 :1 对 于 8086/8088 来 说 计 算 实 际 地
22、 址 是 用 绝 对 地 址 对 1M 求模 。 8086 的 地 址 线 的 物 理 结 构 : 20 根 , 也 就 是 它 可 以 物 理 寻 址 的内 存 范 围 为 220 个 字 节 , 即 1 M 空 间 , 但 由 于 8086/8088 所 使 用的 寄 存 器 都 是 16 位 , 能 够 表 示 的 地 址 范 围 只 有 0-64K, 这 和 1M地 址 空 间 来 比 较 也 太 小 了 , 所 以 为 了 在 8086/8088 下 能 够 访 问 1M内 存 , Intel 采 取 了 分 段 寻 址 的 模 式 : 16 位 段 基 地 址 :16 位 偏 移E
23、A。 其 绝 对 地 址 计 算 方 法 为 : 16 位 基 地 址 左 移 4 位 +16 位 偏 移 =20位 地 址 。 比 如 : DS=1000H EA=FFFFH 那 么 绝 对 地 址 就 为 : 10000H + 0FFFFH = 1FFFFH 地 址 单 元 。 通 过 这 种 方 法 来 实 现 使 用 16 位 寄存 器 访 问 1M 的 地 址 空 间 , 这 种 技 术 是 处 理 器 内 部 实 现 的 , 通 过 上 述分 段 技 术 模 式 , 能 够 表 示 的 最 大 内 存 为 : FFFFh: FFFFh=FFFF0h+FFFFh=10FFEFh=1M
24、+64K-16Bytes( 1M 多 余 出 来 的 部分 被 称 做 高 端 内 存 区 HMA) 。 但 8086/8088 只 有 20 位 地 址 线 , 只能 够 访 问 1M 地 址 范 围 的 数 据 , 所 以 如 果 访 问 100000h10FFEFh 之间 的 内 存 ( 大 于 1M 空 间 ) , 则 必 须 有 第 21 根 地 址 线 来 参 与 寻 址( 8086/8088 没 有 ) 。 因 此 , 当 程 序 员 给 出 超 过 1M( 100000H-10FFEFH) 的 地 址 时 , 因 为 逻 辑 上 正 常 , 系 统 并 不 认 为 其 访 问
25、越 界 而产 生 异 常 , 而 是 自 动 从 0 开 始 计 算 , 也 就 是 说 系 统 计 算 实 际 地 址 的时 候 是 按 照 对 1M 求 模 的 方 式 进 行 的 , 这 种 技 术 被 称 为 wrap-around。2 对 于 80286 或 以 上 的 CPU 通 过 A20 GATE 来 控 制 A20 地 址线 。 技 术 发 展 到 了 80286, 虽 然 系 统 的 地 址 总 线 由 原 来 的 20 根发 展 为 24 根 , 这 样 能 够 访 问 的 内 存 可 以 达 到 224=16M,但 是Intel 在 设 计 80286 时 提 出 的
26、目 标 是 向 下 兼 容 ,所 以 在 实 模 式 下 ,系 统 所 表 现 的 行 为 应 该 和 8086/8088 所 表 现 的 完 全 一 样 , 也 就 是 说 ,在 实 模 式 下 , 80386 以 及 后 续 系 列 应 该 和 8086/8088 完 全 兼 容 仍 然使 用 A20 地 址 线 。 所 以 说 80286 芯 片 存 在 一 个 BUG: 它 开 设 A20地 址 线 。 如 果 程 序 员 访 问 100000H-10FFEFH 之 间 的 内 存 , 系 统 将 实际 访 问 这 块 内 存 ( 没 有 wrap-around 技 术 ) , 而 不
27、 是 象8086/8088 一 样 从 0 开 始 。 我 们 来 看 一 副 图 :为 了 解 决 上 述 兼 容 性 问 题 , IBM 使 用 键 盘 控 制 器 上 剩 余 的 一些 输 出 线 来 管 理 第 21 根 地 址 线 ( 从 0 开 始 数 是 第 20 根 ) 的 有 效性 , 被 称 为 A20 Gate:1 如 果 A20 Gate 被 打 开 , 则 当 程 序 员 给 出 100000H-10FFEFH 之 间 的 地 址 的 时 候 , 系 统 将 真 正 访 问 这 块 内 存 区 域 ;2 如 果 A20 Gate 被 禁 止 , 则 当 程 序 员 给
28、 出 100000H-10FFEFH 之 间 的 地 址 的 时 候 , 系 统 仍 然 使 用 8086/8088 的 方 式 即 取模 方 式 ( 8086 仿 真 ) 。 绝 大 多 数 IBM PC 兼 容 机 默 认 的 A20 Gate是 被 禁 止 的 。 现 在 许 多 新 型 PC 上 存 在 直 接 通 过 BIOS 功 能 调 用 来控 制 A20 Gate 的 功 能 。上 面 所 述 的 内 存 访 问 模 式 都 是 实 模 式 , 在 80286 以 及 更 高系 列 的 PC 中 , 即 使 A20 Gate 被 打 开 , 在 实 模 式 下 所 能 够 访
29、问 的 内存 最 大 也 只 能 为 10FFEFH, 尽 管 它 们 的 地 址 总 线 所 能 够 访 问 的 能 力都 大 大 超 过 这 个 限 制 。 为 了 能 够 访 问 10FFEFH 以 上 的 内 存 , 则 必 须进 入 保 护 模 式 。保 护 模 式 : 经 常 缩 写 为 p-mode,在 Intel iAPX 286 程 序 员 参 考 手册 中 ( iAPX 286 是 Intel 80286 的 另 一 种 叫 法 ) 它 又 被 称 作 为 虚拟 地 址 保 护 模 式 。 经 管 在 Intel 80286 手 册 中 已 经 提 出 了 虚 地 址 保护
30、 模 式 , 但 实 际 上 它 只 是 一 个 指 引 , 真 正 的 32 位 地 址 出 现 在Intel 80386 上 。 保 护 模 式 本 身 是 80286 及 以 后 兼 容 处 理 器 序 列 之后 产 成 的 一 种 操 作 模 式 , 它 具 有 许 多 特 性 设 计 为 提 高 系 统 的 多 道 任务 和 系 统 的 稳 定 性 。 例 如 内 存 的 保 护 , 分 页 机 制 和 硬 件 虚 拟 存 储 的支 持 。 现 代 多 数 的 x86 处 理 器 操 作 系 统 都 运 行 在 保 护 模 式 下 , 包 括Linux, Free BSD, 和 Wi
31、ndows 3.0( 它 也 运 行 在 实 模 式 下 , 为 了和 Windows 2.x 应 用 程 序 兼 容 ) 及 以 后 的 版 本 。80286 及 以 后 的 处 理 器 另 一 种 工 作 模 式 是 实 模 式 ( 仅 当 系 统 启动 的 一 瞬 间 ) , 本 着 向 下 兼 容 的 原 则 屏 蔽 保 护 模 式 特 性 , 从 而 容 许老 的 软 件 能 够 运 行 在 新 的 芯 片 上 。 作 为 一 个 设 计 规 范 , 所 有 的x86 系 列 处 理 器 , 除 嵌 入 式 Intel80387 之 外 , 都 是 系 统 启 动 工 作在 实 模
32、式 下 , 确 保 遗 留 下 的 操 作 系 统 向 下 兼 容 。 它 们 都 必 须 被 启 动程 序 ( 操 作 系 统 程 序 最 初 运 行 代 码 ) 重 新 设 置 而 相 应 进 入 保 护 模 式的 , 在 这 之 前 任 何 的 保 护 模 式 特 性 都 是 无 效 的 。 在 现 代 计 算 机 中 ,这 种 匹 配 进 入 保 护 模 式 是 操 作 系 统 启 动 时 最 前 沿 的 动 作 之 一 。在 被 调 停 的 多 道 任 务 程 序 中 , 它 可 以 从 新 工 作 在 实 模 式 下 是 相 当 可能 的 。 保 护 模 式 的 特 性 是 阻 止
33、 被 其 他 任 务 或 系 统 内 核 破 坏 已 经 不 健全 的 程 序 的 运 行 , 保 护 模 式 也 有 对 硬 件 的 支 持 , 例 如 中 断 运 行 程 序 ,移 动 运 行 进 程 文 档 到 另 一 个 进 程 和 置 空 多 任 务 的 保 护 功 能 。386 及 以 后 系 列 处 理 器 不 仅 具 有 保 护 模 式 又 具 有 32 位 寄 存 器 ,结 果 导 致 了 处 理 功 能 的 混 乱 , 因 为 80286 虽 然 支 持 保 护 模 式 , 但 是它 的 寄 存 器 都 是 16 位 的 , 它 是 通 过 自 身 程 序 设 定 而 模
34、拟 出 的 32位 , 并 非 32 位 寄 存 器 处 理 。 归 咎 于 这 种 混 乱 现 象 , 它 促 使Windows/386 及 以 后 的 版 本 彻 底 抛 弃 80286 的 虚 拟 保 护 模 式 , 以 后保 护 模 式 的 操 作 系 统 都 是 运 行 在 80386 以 上 , 不 再 运 行 在80286( 尽 管 80286 模 式 支 持 保 护 模 式 ) , 所 以 说 80286 是 一 个 过渡 芯 片 , 它 是 一 个 过 渡 产 品 。尽 管 286 和 386 处 理 器 能 够 实 现 保 护 模 式 和 兼 容 以 前 的 版 本 ,但
35、是 内 存 的 1M 以 上 空 间 还 是 不 易 存 取 , 由 于 内 存 地 址 的 回 绕 ,IBM PC XT ( 现 以 废 弃 ) 设 计 一 种 模 拟 系 统 , 它 能 过 欺 骗 手 段 访 问到 1M 以 上 的 地 址 空 间 , 就 是 开 通 了 A20 地 址 线 。 在 保 护 模 式 里 ,前 32 个 中 断 为 处 理 器 异 常 预 留 , 例 如 , 中 断 0D( 十 进 制 13) 常规 保 护 故 障 和 中 断 00 是 除 数 为 零 异 常 。如 果 要 访 问 更 多 的 内 存 , 则 必 须 进 入 保 护 模 式 , 那 么 ,
36、 在 保 护模 式 下 , A20 Gate 对 于 内 存 访 问 有 什 么 影 响 呢 ?为 了 搞 清 楚 这 一 点 , 我 们 先 来 看 一 看 A20 的 工 作 原 理 。A20, 从 它 的 名 字 就 可 以 看 出 来 , 其 实 它 就 是 对 于 A20( 从 0 开 始数 ) 的 特 殊 处 理 (也 就 是 对 第 21 根 地 址 线 的 处 理 )。 如 果 A20 Gate 被 禁 止 , 对 于 80286 来 说 , 其 地 址 为 24 根 地 址 线 , 其 地 址 表示 为 EFFFFF; 对 于 80386 极 其 随 后 的 32 根 地 址
37、 线 芯 片 来 说 , 其 地址 表 示 为 FFEFFFFF。 这 种 表 示 的 意 思 是 :1 如 果 A20 Gate 被 禁 止 。 则 其 第 A20 在 CPU 做 地 址 访 问 的时 候 是 无 效 的 , 永 远 只 能 被 作 为 0。 所 以 , 在 保 护 模 式 下 , 如 果A20 Gate 被 禁 止 , 则 可 以 访 问 的 内 存 只 能 是 奇 数 1M 段 , 即1M,3M,5M, 也 就 是 00000-FFFFF, 200000-2FFFFF,300000-3FFFFF2 如 果 A20 Gate 被 打 开 。 则 其 第 20-bit 是
38、有 效 的 , 其 值 既可 以 是 0, 又 可 以 是 1。 那 么 就 可 以 使 A20 线 传 递 实 际 的 地 址 信 号 。如 果 A20 Gate 被 打 开 , 则 可 以 访 问 的 内 存 则 是 连 续 的 。实 模 式 和 保 护 模 式 的 区 别 : 从表面上看,保护模式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱动来处理硬件,但二者有很多不同之处。我们知道,在实模式中内存被划分成段,每个段的大小为 64KB,而这样的段地址可以用 16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、 SS 和 ES)的内容
39、形成了物理地址的一部分。具体来说,最终的物理地址是由 16位的段地址和 16位的段内偏移地址组成的。用公式表示为:物理地址=左移 4位的段地址+偏移地址。在保护模式下,段是通过一系列被称之为“描述符表”的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种:全局描述符表(GDT) 和局部描述符表(LDT)。GDT 是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。在实模式中,段长是固定的(为 64KB),而在保护模式中,段长是可变的,其最大可达 4GB。LDT 也是段描述符的一个数组。与 GDT不同,LDT 是一个段,其中存放的是局部的、不需要全局共享的段描述符。每一个操作系统都必须定义一个 GDT,而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是 8个字节,格式如图 3所示。当段寄存器被加载的时候,段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中,以便下一次同一个段可以使用该信息而不用每次都到表中提取。物理地址由 16位或者 32位的偏移加上影像寄存器中的基址组成。实模式和保护模式的不同可以从下图很清楚地看出来。实 模 式 下 寻 址 方 式保 护 模 式 下 寻 址 方 式