从物理资源方面看:real 模式是 protected 模式的子集,而 protected 模式是 long 模式的子集。所以:real 模式、protected 模式以及 long 模式的物理资源是一样的。 |
processor 在 real 模式、protected 模式以及 long 模式物理结构是一致的。所不同只是 processor 的功能集在不同模式下不同。
1.2、real 模式 大多数系统结构就是初始态,所以限制 real 模式只能访问 1M 地址空间的本质因素是 CS.limit = FFFFh,DS.limit = FFFFh,且 limit 属性在实模式下是不能改变的(但是还是有方法可以改变的)。
1.2.1、 CS.base 改变 CS.base = 0000_0000_FFFF_0000h,RIP = 0000_0000_0000_FFF0h,但这从执第 1 条指令开始就开始改变了。第 1 条指令地址 FFFF_FFF0 的地方的指令:jmp far ptr F000:E05B。 执行后 processor 自动更新 CS.base = 000F_0000h,这个 base 的计算方法是使用 real 模式的段计算方法 F000 左移 4 位。
这个 base 改变行式同样适合 DS、ES、SS、FS 及 GS,当加载新的段选择子时自动更新 base 。
1.2.2、 CS.D 及 CS.DPL 属性 另外 2 个限制 real 模式行为的属性是 CS.D 及 CS.DPL。
CS.D = 0 本质上决定 real 模式的 Default Operands-Size 是 16 位,CS.DPL = 00 定义了 processor 的执行权限是 0 级(最高级)。
1.2.3、 IDTR.base IDTR.base = 0,决定了 IVT(中断向量表)的位置在 0 处。原理上这个 IDTR.base 是可以改变,执行 LIDT 指令可以更新 IDTR.base 属性。
1.2.4、 其它系统数据结构 除了 IDT 外,像 GDT 、LDT 及 TSS 这些系统数据结构是这不可用的。从而将相关 pretected 措施禁闭了。其实只是 IDTR 可用,IDT 数据结构在 real 模式下为 IVT 数据结构。
1.2.5 总结 real 模式的执行环境CR0.PE = 0,禁止 protected 模式:
(1)CS.limit = FFFFh & DS.limit = FFFFh :段限 64K。
(2)CS.base = CS.selector << 4 & DS.base = DS.selector << 4 :段基址 20 位,可寻址 1M 空间。
(3)CS.D = 0 & CS.DPL = 0:16 位代码,运行在 0 级。
(4)IDTR.base = 0:IVT 在 0 位置。
1.2.6 A20 作用 增加了 Bit20 地址线,在 real 模式可访问 1M 以上的扩展空间,理论上可访问:0 ~ 1FFFFF
以下代码:
mov ax, FFFFh
mov ds, ax
mov al, byte ptr ds:[FFFFh]
------------------------------------------------
DS.base = FFFF << 4 = FFFF0h
address: DS.base + FFFFh = FFFF0 + FFFFh = 10FFEFh
bit20
1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1
-
这个 10FFEFh 在 1M 地址之上,在第 21 条地址线 A20 有效的时候可以访问,若 A20 = 0 无效时,只能访问:0FFEFh。这是一个地址回绕现象。
开启 A20 时实际可访问空间为:0 ~ 10FFEFh,总共多了 FFF0 字节,即 65520 个字节扩展空间。
1.2.7 A20 Gate A20 gate 决定何时开启 A20,以前的 A20 gate 是连接到 keyboard controller(键盘控制器)端口 64h 上,通过对 64h 端口相应的 A20 gate 置位而控制开启 A20。
现在的 processor 都有一个 A20M#(Address 20 Mask) 信号,仅在实模式下有效。有效时模拟 8086 行为。