在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 语法)
PC寻址方式遗留问题——A20地址线
最新推荐文章于 2024-02-24 10:54:19 发布