最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

激活A20地址线详解

IT圈 admin 27浏览 0评论

2024年6月10日发(作者:绍俊豪)

激活A20地址线详解

A20地址线是一个很不容易理解的地方,这主要是由于历史原因造成的。在8086/8088

中,有20根地址线,所以可以访问的地址是2^20=1M,但由于8086/8088是16位地址模式,

能够表示的地址范围是0-64K,为了在8086/8088下能够访问1M内存,Intel采取了分段的

模式:16位段基地址:16位偏移。但是这种方式有一个问题,他的最大的访问空间为:0xFFFF:

0xFFFF=0x10FFEF=1M+64K-16Bytes,但8086/8088只有20位地址线,如果访问

100000h~10FFEFh之间的内存,则必须有第21根地址线。所以当程序员给出超过1M

(100000H-10FFEFH)的地址时,系统并不认为其访问越界而产生异常,而是自动从重新

0开始计算。到了80286,系统的地址总线发展为24根,这样能够访问的内存可以达到

2^24=16M。在实模式下,80286和其后续系统所表现的行为应该和8086/8088所表现的完

全一样,但是,80286芯片却存在一个BUG:如果程序员访问100000H-10FFEFH之间的

内存,系统将实际访问这块内存,而不是重新从0开始。为了解决这个问题,IBM使用键盘

控制器上剩余的一些输出线来管理第21根地址线,即A20 Gate。如果A20 Gate被打开,

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

果A20 Gate被禁止,则当程序员给出100000H-10FFEFH之间的地址的时候,系统仍然使

用8086/8088的方式。从80286开始,系统出现了一种新的机制,被称为保护模式。那为什

么进入保护模式一定要打开A20呢,它对保护模式有什么影响?如果A20 Gate被禁止,对

于80286来说,其地址为24bit,其地址表示为EFFFFF;对于80386极其随后的32-bit芯片

来说,其地址表示为FFEFFFFF。这种表示的意思是如果A20 Gate被禁止,则其第20-bit

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

是有效的,其值既可以是0,又可以是1。

所以,如果A20被禁止,可访问的内存只能是奇数段(2N+1)M,只有当A20被打开

的时候才能访问连续的内存。

下面讨论一下如何打开A20地址线:

通常的方法是通过设置键盘控制器的端口值,不过有些系统觉得键盘控制器很慢,为此

引入了一个Fast Gate A20,它用IO端口的0x92来处理A20信号线。还有一种方法是通过

读取0xee端口来开启A20地址线,写端口则会禁止地址线。

我给大家介绍的是最普通的方法.

先看看804x的逻辑图

由此可见,端口p2的第1位(从0开始)就是控制A20地址线的地方,如果它置位,则

开通A20地址线。分配给IO控制器的端口为0x60-0x6f,但IBM PC只用0x60和0x64,如

下图:

系统在向0x60发送一字节的时候,就是发送键盘命令,键盘在接受命令后20ms内给予

反应,并返回一个0xfa相应码。

键盘命令如下图:

系统向0x64写一字节,就是发送一个键盘控制器命令,可带参数,参数由0x60发送。

键盘控制命令如图:

从理论上讲,打开A20 Gate的方法是通过设置8042芯片输出端口(64h)的2nd-bit,

但事实上,当你向8042芯片输出端口进行写操作的时候,在键盘缓冲区中,或许还有别的

数据尚未处理,因此你必须首先处理这些数据。

所以,激活A20地址线的流程为:

1.禁止中断;

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

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

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

5.向P2写入数据,将OR2置1;

相关程序如下:

act20addr:

call wait_8042free ;;等待8042为空

mov al,0x0D1 ;;D1的意思是向8042端口的P2写数据

mov dx,0x064

out dx,al

call wait_8042free

mov al,0x0DF ;;DF为11011111,写入P2,根据图示,A20位置1,开通了

A20地址线

mov dx,0x060

out dx,al

ret

wait_8042free:

.ll_begin:

in al,0x64

test al,0x02 ;;测试指令,与运算。判断第二位是否为0,如果为0,则代表8042

是空的

jnz .ll_begin ;;如果运算为0,即8042为空,则返回,不为空,则继续读取缓冲

器内容

ret

到此为止,A20的激活就已经完成了。

2024年6月10日发(作者:绍俊豪)

激活A20地址线详解

A20地址线是一个很不容易理解的地方,这主要是由于历史原因造成的。在8086/8088

中,有20根地址线,所以可以访问的地址是2^20=1M,但由于8086/8088是16位地址模式,

能够表示的地址范围是0-64K,为了在8086/8088下能够访问1M内存,Intel采取了分段的

模式:16位段基地址:16位偏移。但是这种方式有一个问题,他的最大的访问空间为:0xFFFF:

0xFFFF=0x10FFEF=1M+64K-16Bytes,但8086/8088只有20位地址线,如果访问

100000h~10FFEFh之间的内存,则必须有第21根地址线。所以当程序员给出超过1M

(100000H-10FFEFH)的地址时,系统并不认为其访问越界而产生异常,而是自动从重新

0开始计算。到了80286,系统的地址总线发展为24根,这样能够访问的内存可以达到

2^24=16M。在实模式下,80286和其后续系统所表现的行为应该和8086/8088所表现的完

全一样,但是,80286芯片却存在一个BUG:如果程序员访问100000H-10FFEFH之间的

内存,系统将实际访问这块内存,而不是重新从0开始。为了解决这个问题,IBM使用键盘

控制器上剩余的一些输出线来管理第21根地址线,即A20 Gate。如果A20 Gate被打开,

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

果A20 Gate被禁止,则当程序员给出100000H-10FFEFH之间的地址的时候,系统仍然使

用8086/8088的方式。从80286开始,系统出现了一种新的机制,被称为保护模式。那为什

么进入保护模式一定要打开A20呢,它对保护模式有什么影响?如果A20 Gate被禁止,对

于80286来说,其地址为24bit,其地址表示为EFFFFF;对于80386极其随后的32-bit芯片

来说,其地址表示为FFEFFFFF。这种表示的意思是如果A20 Gate被禁止,则其第20-bit

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

是有效的,其值既可以是0,又可以是1。

所以,如果A20被禁止,可访问的内存只能是奇数段(2N+1)M,只有当A20被打开

的时候才能访问连续的内存。

下面讨论一下如何打开A20地址线:

通常的方法是通过设置键盘控制器的端口值,不过有些系统觉得键盘控制器很慢,为此

引入了一个Fast Gate A20,它用IO端口的0x92来处理A20信号线。还有一种方法是通过

读取0xee端口来开启A20地址线,写端口则会禁止地址线。

我给大家介绍的是最普通的方法.

先看看804x的逻辑图

由此可见,端口p2的第1位(从0开始)就是控制A20地址线的地方,如果它置位,则

开通A20地址线。分配给IO控制器的端口为0x60-0x6f,但IBM PC只用0x60和0x64,如

下图:

系统在向0x60发送一字节的时候,就是发送键盘命令,键盘在接受命令后20ms内给予

反应,并返回一个0xfa相应码。

键盘命令如下图:

系统向0x64写一字节,就是发送一个键盘控制器命令,可带参数,参数由0x60发送。

键盘控制命令如图:

从理论上讲,打开A20 Gate的方法是通过设置8042芯片输出端口(64h)的2nd-bit,

但事实上,当你向8042芯片输出端口进行写操作的时候,在键盘缓冲区中,或许还有别的

数据尚未处理,因此你必须首先处理这些数据。

所以,激活A20地址线的流程为:

1.禁止中断;

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

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

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

5.向P2写入数据,将OR2置1;

相关程序如下:

act20addr:

call wait_8042free ;;等待8042为空

mov al,0x0D1 ;;D1的意思是向8042端口的P2写数据

mov dx,0x064

out dx,al

call wait_8042free

mov al,0x0DF ;;DF为11011111,写入P2,根据图示,A20位置1,开通了

A20地址线

mov dx,0x060

out dx,al

ret

wait_8042free:

.ll_begin:

in al,0x64

test al,0x02 ;;测试指令,与运算。判断第二位是否为0,如果为0,则代表8042

是空的

jnz .ll_begin ;;如果运算为0,即8042为空,则返回,不为空,则继续读取缓冲

器内容

ret

到此为止,A20的激活就已经完成了。

发布评论

评论列表 (0)

  1. 暂无评论