



开启A20地址线,可以寻址大于1MB的物理内存,如果不开启A20,后面无法加载osloader.exe到物理内存空间0x400000。能访问大于1MB的内存,是我们最终要达到的目标。
在8086或8088上有20根地址线,能够寻址2 20 B=1MB的内存空间。由于它们使用分段的逻辑地址形式(也就是segment:offset)进行编址,在计算线性地址时,将16位段寄存器的值左移4位后,加上16位偏移量。因此,能产生的最高线性地址值是:FFFF:FFFF=FFFF0+FFFF=10FFEFh。但是由于受到20根地址线的物理条件限制,只能寻址1M以内的空间。那么,超过1M的地址值将是无效的(not-present),10FFEFh地址的高4位(bit 23:20,这是什么?就是10FFEFh最前面的那个1)被抛弃。访问10FFEFh地址等于访问了0FFEFh地址。
8086和8088的这种行为被称为“环绕(wrap-around)”,这种寻址方式,实际上就是一种取模计算方式,即根据计算得到的实际物理地址对1M进行取模。
到80286之后,地址线发展到24根,并且开始引入了保护模式,这时能寻址的空间大小为2 24 B=16MB,可以访问所有16MB空间。但是,为了兼容8086/8088,就产生了处理器的两种工作模式,即实模式与保护模式。X86体系从此就背上了兼容的包袱。
实模式的产生是为了兼容8086/8088处理器的工作方式,在实模式下仍然采用分段的逻辑地址寻址,只能寻址1M地址空间。80286的实模式分段寻址与8086/8088的分段寻址出现了一个很大的区别。以前面所说的分段机制下的最高地址值10FFEFh为例,由于80286有24根地址线,它能物理地访问到10FFEFh这个地址值。而8086/8088却只能访问到0FFEFh地址。这就造成了在某些条件下,80286的实模式寻址与8086/8088的寻址行为变得不一样。
为了解决这个问题,引入了A20 gate电路作为地址bit 20的一个开关值。当A20 gate闭合时,A20地址线是有效的;当A20 gate断开时,A20地址是无效的。那么,通过将A20 gate断开这个手段,就能使80286实模式下的寻址与8086/8088的寻址一样。
需要注意的是,在实模式工作方式下,在80286或者更高系列的处理器中,即使打开了A20地址线,其实际的地址总线访问能力大大超过这个范围,能够寻址的最大范围也只是10FFEFh。为了能够访问更大空间的内存,我们需要进入保护模式。那么我们可不可以跳过开启A20地址线这一过程而直接进入保护模式呢?答案肯定是不可以的。我们可以看一看A20地址线开启与否是否会对保护模式的内存访问产生什么影响。若当前A20地址线没有开启,地址线第20位(从0开始算起)只能为0,那么能被访问的内存只能是奇数M段,即1M、3M、5M……这样可以访问的内存不是连续的。只有开启A20地址线,才能访问到连续的内存。下面我们看一下A20地址线是如何被开启的。