精品激活A20地址线详解.docVIP

  • 4
  • 0
  • 约2.15千字
  • 约 7页
  • 2017-09-12 发布于湖北
  • 举报
激活A20地址线详解

激活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写入P2,根据图示,A20位置1,开通了A20地址线 mov dx,0x060 out dx,al ret wait_8042free: .ll_begin: in al,0x64

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档