您的位置:首页 > 其它

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

2009-07-22 11:15 253 查看
在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 语法)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: