PC寻址方式遗留问题——A20地址线


在8086/8088CPU上,总共有20根地址线,可以寻址1M内存空间。但是8086的寻址方式却事实上可以访问到1M+64K的地址空间。想象一下,当段寄存器的值为FFF0h,而断内偏移为1000h的时候,通过段地址*16+偏移地址计算出来的物理地址是100F00h,而这已经超过了1M的地址范围!但是由于8086/8088只有20根地址线,因此,第20位被丢失了。实际上这个段地址和偏移地址的组合访问的实际物理地址是0xF00。

后来出现了80286CPU,而286有24根地址线。所以,在286上,上述的段地址和偏移地址的组合实际上会访问1M以上的内存。这导致了80286CPU和8086CPU的不兼容。因此,IBM在推出80286的PC的时候,在主板上做了一个开关,当这个开关没有打开的时候,CPU的第20根地址线会被强制设为0,就像这条地址线不存在一样。这样就和8086/8088一样了。

但是当我们切换到保护模式的时候,我们必须用全所有的32根地址线,所以我们必须打开主板上这个开关。下面的代码可以用来打开A20地址线

    call    empty_8042
    mov     al,d1h
    out     64h,al
    call    empty_8042
    mov     al,dfh
    out     60h,al
    call    empty_8042

empty_8042:
    dw      00ebh,00ebh //延时
    in      al,64h
    test    al,2h          
    jnz     empty_8042     
    ret


(上述代码摘自Linux0.11源代码,我将其改写成了MASM 语法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值