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 语法)
后来出现了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 语法)
相关文章推荐
- 地址环绕和A20地址线问题
- 段寄存器和8种地址寻址方式
- 有关TI DSP的EMIF接口的两个问题:地址总线不从零开始问题及寻址范围问题
- A20 地址线问题
- Android设备MTP方式连接PC增删文件无法实时更新的问题
- A20地址线问题
- IPv6的地址表达方式、寻址模型和地址空间
- A20地址线问题
- 对标号地址的另一种相对寻址方式
- 汇编语言学习笔记之与转移地址有关的寻址方式
- JSP/Servlet处理系统异常的两种方式、路径(地址)问题、线程安全问题
- PC自增与转移地址计算问题总结
- A20地址线问题
- 有关TI C6000的DSP的EMIF接口的两个问题:地址总线不从零开始问题及寻址范围问题
- A20地址线问题
- 七种寻址方式(32位地址的寻址方式)
- 关于ajax get方式请求 url地址参数怎么变成空了的问题
- 汇编语言的寻址地址方式 (长沙戴维营)
- 七种寻址方式(32位地址的寻址方式)
- A20地址线问题