A20Gate

A20门控是8086/8088处理器时代的产物,为了解决1M内存访问问题,通过开启或关闭第21根地址线实现内存寻址。在80286及后续CPU中,实模式下A20门控保持向下兼容,但在保护模式下,A20门控的开启与关闭影响内存访问方式。开启A20门控允许访问连续内存,关闭则只能访问奇数1M内存段。通常通过键盘控制器8042来管理A20门控,启用过程涉及复杂的中断处理和数据同步。

很多稀奇古怪的东西都是由于系统升级时,为了保持向下兼容而产生的,A20 Gate就是其中之一。

在8086/8088中,只有20根地址总线,所以可以访问的地址是2^20=1M,但由于8086/8088是16位地址模式,能够表示的地址范围是0-64K,所以为了在8086/8088下能够访问1M内存,Intel采取了分段的模式:16位段基地址:16位偏移。其绝对地址计算方法为:16位基地址左移4位+16位偏移=20位地址。

但这种方式引起了新的问题,通过上述分段模式,能够表示的最大内存为:FFFFh:FFFFh=FFFF0h+FFFFh=10FFEFh=1M+64K-16Bytes(1M多余出来的部分被称做高端内存区HMA)。但8086/8088只有20位地址线,如果访问100000h~10FFEFh之间的内存,则必须有第21根地址线。所以当程序员给出超过1M(100000H-10FFEFH)的地址时,系统并不认为其访问越界而产生异常,而是自动从重新0开始计算,也就是说系统计算实际地址的时候是按照对1M求模的方式进行的,这种技术被称为wrap-around。

到了80286,系统的地址总线发展为24根,这样能够访问的内存可以达到2^24=16M。Intel在设计80286时提出的目标是,在实模式下,系统所表现的行为应该和8086/8088所表现的完全一样,也就是说,在实模式下,80286以及后续系列,应该和8086/8088完全兼容。但最终,80286芯片却存在一个BUG:如果程序员访问100000H-10FFEFH之间的内存,系统将实际访问这块内存,而不是象过去一样重新从0开始。

为了解决上述问题,IBM使用键盘控制器上剩余的一些输出线来管理第21根地址线(从0开始数是第20根),被称为A20 Gate:如果A20

Gate被打开,则当程序员给出100000H-10FFEFH之间的地址的时候,系统将真正访问这块内存区域;如果A20

Gate被禁止,则当程序员给出100000H-10FFEFH之间的地址的时候,系统仍然使用8086/8088的方式。绝大多数IBM PC兼容机默认的A20

Gate是被禁止的。由于在当时没有更好的方法来解决这个问题,所以IBM使用了键盘控制器来操作A20 Gate,但这只是一种黑客行为,毕竟A20

Gate和键盘操作没有任何关系。在许多新型PC上存在着一种通过芯片来直接控制A20 Gate的BIOS功能。从性能上,这种方法比通过键盘控制器来控制A20

Gate要稍微高一点。
上面所述的内存访问模式都是实模式,在80286以及更高系列的PC中,即使A20

Gate被打开,在实模式下所能够访问的内存最大也只能为10FFEFH,尽管它们的地址总线所能够访问的能力都大大超过这个限制。为了能够访问10FFEFH以上的内存,则必须进入保护模式。(其实所谓的实模式,就是8086/8088的模式,这种模式存在的唯一理由就是为了让旧的程序能够继续正常的运行在新的PC体系上)

  1. A20 Gate in Protected Mode

从80286开始,系统出现了一种新的机制,被称为保护模式。到了80386,保护模式得到了进一步的完善和发展,并且对于80386以后的芯片,保护模式的变化就非常小了。

我们在上一节已经谈到,如果要访问更多的内存,则必须进入保护模式,那么,在保护模式下,A20 Gate对于内存访问有什么影响呢?

为了搞清楚这一点,我们先来看一看A20的工作原理。A20,从它的名字就可以看出来,其实它就是对于20-bit(从0开始数)的特殊处理(也就是对第21根地址线的处理)。如果A20

Gate被禁止,对于80286来说,其地址为24bit,其地址表示为EFFFFF;对于80386极其随后的32-bit芯片来说,其地址表示为FFEFFFFF。这种表示的意思是如果A20

Gate被禁止,则其第20-bit在CPU做地址访问的时候是无效的,永远只能被作为0;如果A20

Gate被打开,则其第20-bit是有效的,其值既可以是0,又可以是1。
所以,在保护模式下,如果A20 Gate被禁止,则可以访问的内存只能是奇数1M段,即1M,3M,5M…,也就是00000-FFFFF,

200000-2FFFFF,300000-3FFFFF…。如果A20 Gate被打开,则可以访问的内存则是连续的。
2. How to Enable A20 Gate

多数PC都使用键盘控制器(8042芯片)来处理A20 Gate。

从理论上讲,打开A20

Gate的方法是通过设置8042芯片输出端口(64h)的2nd-bit,但事实上,当你向8042芯片输出端口进行写操作的时候,在键盘缓冲区中,或许还有别的数据尚未处理,因此你必须首先处理这些数据。
流程如下:

1. 禁止中断;

2. 等待,直到8042 Input buffer为空为止;

3. 发送禁止键盘操作命令到8042 Input buffer;

4. 等待,直到8042 Input buffer为空为止;

5. 发送读取8042 Output Port命令;

6. 等待,直到8042 Output buffer有数据为止;

7. 读取8042 Output buffer,并保存得到的字节;

8. 等待,直到8042 Input buffer为空为止;

9. 发送Write 8042 Output Port命令到8042 Input buffer;

10. 等待,直到8042 Input buffer为空为止;

11. 将从8042 Output Port得到的字节的第2位置1(OR 2),然后写入8042 Input buffer;

12. 等待,直到8042 Input buffer为空为止;

13. 发送允许键盘操作命令到8042 Input buffer;

14. 打开中断。

### A20 Gate in Computer Architecture The A20 line plays a crucial role in addressing memory beyond 1 MiB on IBM PCs and compatible systems. Initially, the Intel 8086 processor used only 20 address lines (A0-A19), allowing it to access up to 1 MiB of physical RAM. However, when the IBM PC/AT was introduced with an upgraded 80286 CPU using 24 address lines (A0-A23)[^1], this allowed for accessing up to 16 MiB of memory. To maintain compatibility between older software designed for earlier CPUs like the 8086 and newer processors that could handle more than 1 MiB of RAM, manufacturers implemented what became known as the "A20 gate." This mechanism controls whether the system uses the 21st address line (A20). By default, the A20 line remains disabled through hardware control via the keyboard controller chip during boot-up; thus, emulating behavior similar to early 8086-based machines where any attempt at higher addresses would wrap around back into lower regions due to fewer available bits being utilized by those initial designs. When operating systems or applications require full utilization of extended memory above 1 MB—or wish to switch their environment from real mode into protected modes—they must enable the A20 signal before performing these operations. Enabling involves sending specific commands directly to the keyboard controller which manages switching states of the A20 pin within its circuitry design. Once enabled, programs gain unrestricted linear access across all installed DRAM without encountering wrapping issues present under legacy conditions imposed upon them prior to enabling this feature. ```assembly mov al, 0xd1 ; Command byte to write output port out 0x64, al ; Send command to keyboard controller's status register xor al, al ; Data byte value zero out 0x60, al ; Write data byte to disable A20 gate ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值