最初的处理器因为只有20根地址线,因此处理器只能寻址2^20B(=1MB)的物理地址空间,如果地址超过1MB范围,就会发生“地址回环”
例如:指令jmp FFFFh:FFFFh,跟据实模式下寻址原理,将跳转到FFFFh<<4+FFFFh=10FFEFh,因为10FFEFh超过了100000h的寻址范围,所以地址被强制回环到1MB以下,即10FFEFh-100000h=FFEFh
当然,随着处理器寻址能力的不断增强,20根地址线已经无法满足今后的开发需求,为了保证硬件平台的向下兼容性,便出现了一个控制或禁止1MB以上地址空间的开关
这种设计从Intel 80386之后出现,这是由IBM PC XT首先设计的一种模拟系统,它可以通过欺骗手段访问到1MB以上的地址空间,而不需要进入保护模式——向键盘控制器8042发送命令
键盘控制器8042在接收到命令后将它的P21引脚(输出端口P2)置高电平。此时处理器将A20地址线和键盘控制器的这个输出端口的进行AND操作,进而控制A20地址线的打开和关闭。键盘控制器的这个引脚因此得名A20 Gate
键盘控制器8042即Intel 8042芯片,位于主板上,CPU通过IO端口直接与这个芯片进行通信,对应的IO端口为0x60。但向该端口写入数据的方法比较复杂,0x60是一个只读端口,不能使用IN/OUT指令直接操作0x60端口,需要涉及0x64端口。其中,0x60端口的位1用于影响A20【需要注意的是,处理器的“IO端口”和键盘控制器的“输出端口”中的“端口”为不同概念,前者本质上是一种物理地址,而后者本质上是引脚的别名】
但是涉及IO设备的操作不仅会引起忙等待,而且需要的指令数量也多,因此从Intel 80486开始,处理器本身引入了A20M#(A20 Mask)引脚,低电平有效
同时,除了端口号0x60可以影响A20寻址,端口0x92也用于A20寻址,被称作“替代的A20门控制”(Alternate A20 Gate,ALT_A20_GATE)。其中,0x92端口的位0用于计算机重启,位1用于影响A20地址线。与0x60不同,0x92可以直接使用IN/OUT指令进行修改,方便快捷,因此也被称作Fast A20。0x60和0x92的位1进行或运算后连接到A20M#引脚,用于控制A20地址线的开启和关闭
机器在上电时,默认情况下A20地址线是被禁用的,常见的打开方式有如下几种:
1、操作键盘控制器【即上文中的0x60端口】
2、A20快速门【即上文中的0x92端口】
3、BOIS中断服务操作,使用INT 15h,ax=2401h来开启A20地址线,ax=2400h来关闭地址线
4、读0xee端口开启地址线,写0xee端口禁止地址线
A20的开启会对实模式和保护模式的下寻址产生影响影响,以下讨论均基于Intel 80386之后的处理器
在实模式下,处理器的寻址仅涉及CS和IP两个寄存器,即CS<<4+IP,对应的线性地址为0h-10ffefh。当A20地址线处于关闭状态时,A20强制置0,此时实际寻址范围为0h-fffffh。但当A20处于打开状态,A20可以接受来自A19的进位,此时实际寻址范围为0h-10ffefh
在保护模式下,处理器寻址是基于段选择子和段描述符,段描述符中段基地址32bit,段限长20bit,理论最大寻址范围为0h-1000fffefh。当A20地址线处于关闭状态时,经过计算的地址的第21位被强制置0,导致处理器无法寻址MB为奇数的任何线性地址。例如,对于0x000100ab,将会被强制转换为0x000000ab。需要注意的是,该操作影响寻址的原理是影响线性地址,而不是影响虚拟地址。当然,A20处于打开状态,就没有任何影响了
标签:A20,端口,地址,寻址,处理器,0x60,小记 From: https://www.cnblogs.com/miomo323/p/17090608.html