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的激活就已经完成了。