关于A20地址线

部分转载,不能说明,谅解!

操作系统又实模式进入保护模式之前要打开A20地址线。
那么什么是A20地址线呢?经过一番查证理解如下:
80868088中,有20跟地址线。所以寻址范围是2^20 = 1M,但8086/808816位的地址模式,即只能表示FFFFH64K)的范围。为了能访问1M的内存采取了分段的模式。
16位段基址:16位偏移。
0XFFFF:0XFFFF达到了0X10FFEF
但是8086/8088的内存不可能超过1MB,所以当时的程序超过1MB时会自动回卷。
但是到了80286地址线达到24跟。而386达到32根。芯片也达到32-bit。寻址能力达到4GB。但是为了向后兼容IBM采用了一个控制方法。用键盘控制器上的一个剩余的控制线来控制(注意是键盘控制器上的控制线,而不是地址线的第20跟)。即A20控制线。当A20控制线打开时可以使用20-31的地址线。而当A20关闭时20-31的地址线全部为0.

所以,如果A20被禁止,可访问的内存只能是奇数段(2N+1M,只有当A20被打开的时候才能访问连续的内存。
只有A20打开才能进入保护模式。
下面讨论一下如何打开A20地址线:

从理论上讲,打开A20 Gate的方法是通过设置8042芯片输出端口(64h)的2nd-bit,但事实上,当你向8042芯片输出端口进行写操作的时候,在键盘缓冲区中,或许还有别的数据尚未处理,因此你必须首先处理这些数据。
所以,激活A20地址线的流程为:
    1.关闭
    2.
等待8042 Input buffer空;
    3.
送禁止键盘操作命令;
    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(或0),然后8042 Input buffer
    12.
等待,直到8042 Input buffer止;
    13.
送允许键盘操作命令到8042 Input buffer
    14.
    下面是完成打A20 Gate的代
    A20Enable:
                cli                     ;1.
关闭
                call WaitInbufEmpty    ;2.
等待8042 Input buffer空;
                mov al, 0adh
                mov dx, 64h
                out dx, al              ;3.
送禁止键盘操作命令
                call WaitInbufEmpty    ;4.
等待8042 Input buffer空;
                mov al, 0d0h
                mov dx, 64h
                out dx, al              ;5.
8042 Output Port命令;
                call WaitOutbufFull     ;6.
等待8042 Output buffer据;
                mov dx, 60h
                in al, dx               ;7.
8042 Output buffer
                push ax                 ;
保存取的
                call WaitInbufEmpty     ;8.
等待8042 Input buffer空;
                mov al, 0d1h
                mov dx, 64h
                out dx, al              ;9.
8042 Output Port命令
                call WaitInbufEmpty     ;10.
等待8042 Input buffer
                pop ax
                or al, 02h              ;11.
将从8042 Output Port得到的字bit 11
                mov dx, 60h
                out dx, al              ;
Output Port
                call WaitInbufEmpty    ;12.
等待8042 Input buffer
                mov al, 0aeh
                mov dx, 64h
                out dx, al              ;13.
送允许键盘操作命令
                sti                     ;

                ret
    WaitInbufEmpty:
                mov dx, 64h
                in al, dx               ;
Status Register
                test al, 02h
                jnz WaitInbufEmpty
                ret
WaitOutbufFull:
                mov dx, 64h
                in al, dx
                test al, 01             ;
Status Register
                jz WaitOutbufFull
                ret
后来,由于感觉使用8042控制A20运行太慢了(确实,那么长的代码,中间还要若干次的wait),所以后来又出现了所谓的Fast A20,实际上,现在的大多数机器都是Fast A20Fast A20使用92h端口控制A20,同时BIOS里提供了一个软中断来控制A20
 
    入口:ah=24h
          al=0    关闭A20
             1    打开A20
             2    读取A20状态
          int 15h
 
    返回:如果BIOS支持此功能,CF=0,否则CF=1
          CF=0时,AX返回当前A20状态,1=打开,0=关闭
 
    8042中的Output Port中的定义一样,92h端口的bit 1控制着A20,为1时打开,为0时关闭,从92h中读一个byte可以看a20的当前状态,所以对92h的操作如下:
 
A20状态
mov dx, 92h
in al, dx
如果albit 11表示a20打开,否则为0
打开A20
mov dx, 92h
mov al, 02
out dx, al
关闭A20
mov dx, 92h
mov al, 0
out dx, al
 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值