Gate A20与保护模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Gate A20与保护模式
大家都知道,8088/8086只有20位地址线,按理它的寻址空间是2^20,应该是1024KB,但PC机的寻址结构是segment:offset,segment和offset都是16
位的寄存器,最大值是0ffffh,换算成物理地址的计算方法是把segment左移4位,再加上offset,所以segment:offset所能表达的寻址空间最大应为0ffff0h +
0ffffh = 10ffefh(前面的0ffffh是segment=0ffffh并向左移动4位的结果,后面的0ffffh是可能的最大offset),这个计算出的10ffefh是多大呢?大约是1088KB,就是说,segment:offset的地址表达能力,超过了20位地址线的物理寻址能力,你说这是不是有点麻烦。在早先,由于所有的机器都没有那么大的内存,加上地址线只有20位,所以当你用segment:offset的方式企图寻址100000h这个地址时,由于没有实际的第21位地址线,你实际寻址的内存是00000h的位置,如果你企图寻址100001h这个地址时,你实际得到的内容是地址00001h上的内容,所以这个事对实际使用几乎没有任何影响,但是后来就不行了,出现了80286,地址线达到了24位,使segment:offset寻址100000h--10ffefh这将近64K的存储器成为可能,为了保持向下兼容,于是出现了A20 Gate,这是后话,我们后面再细说。
我们可能经常听到一些只有在PC机上才有的一些关于存储器的专有名词,包括:常规内存(Conventional Memory)、上位内存区(Upper Memory Area)、高端内存区(High Memory Area)和扩展内存(Extended Memory),我尽量把这几个东东说明白,这需要下面这张著名的图。
这张图很清楚地说明了问题,大家都知道,DOS下的“常规内存”只有640K,这640K就是从0--A0000H这段地址空间;所谓“上位内存区”,指的就是20位地址线所能寻址到的1M地址空间的上面384K空间,就是从A0001H--100000H 这段地址空间,也就是我们说的用于ROM和系统设备的地址区域,这384K空间和常规内存的640K空间加起来就是20位地址线所能寻址的完整空间
1024KB;由于80286和80386的出现使PC机的地址线从20位变成24位又变成32位,寻址能力极大地增加,1M以上的内存寻址空间,我们统称为“扩展内存”;这里面绝大部分内存区域只能在保护模式下才能寻址到,但有一部分既可以在保护模式下,也可以在实模式下寻址,这就是我们前面提到过的地址100000h--10ffefh之间的这块内存,为了表明其特殊性,我们把这块有趣的内存区叫做“高端内存”。
前面我们提过由于IBM的愚蠢设计给PC机的内存结构埋下了麻烦的伏笔,现在我们来说说这个麻烦。我们都见过PC机上的内存条,但是由于上位内存区
的存在,这个内存条上的地址居然不能连续,就是说,这个内存条上要有
0--A0000H的地址空间,还要有100000h--最大内存容量的地址空间,中间的384K 地址空间必须留出来给ROM用,在现如今一个芯片就好几兆的情况下,你说这个内存条应该怎么做,当然我相信一定是可以做出来的,但肯定很麻烦,如果当初IBM把这个“上位内存区”放在地址低端,就是0--6000h这一部分,岂不是这个麻烦就没有了?!
但是,实际的内存条上地址都是连续的,并没有人把这段地址空间留出来给ROM使用,原因很简单,采用技术手段把这段地址空间空出来,比浪费这384K 内存的成本还要高,所以在这个地址区域就出现了很奇怪的现象,ROM和RAM 的地址重叠。实际上,往往ROM并不能完全覆盖整个384K区域,这样就会有一些地址没有被ROM占用,那么这部分地址上的RAM仍然是可以使用的。实际上,和ROM重叠的这384K RAM一般也不会被浪费,说到这里,不得不说所谓的ROM Shadowing了,RAM和ROM的性能是有很大差异的,RAM的存取速度要远远大于ROM,而且RAM可以32位存取,ROM通常只能16位,所以目前的PC机对这块RAM和ROM重叠的区域的处理采用一种ROM Shadowing 的技术方式,当机器加电后,先让ROM有效,RAM无效,然后读出ROM内容,再让ROM无效,RAM有效,把读出的ROM内容放到相同地址的RAM中,并把相应位置的RAM设定为只读,这样就把ROM搬到了RAM中,地址完全一样,只是性能比使用ROM要高些,这块RAM就好像ROM的Shadow一样。
回到我们的主题A20 Gate,出现80286以后,为了保持和8086的兼容,PC 机在设计上在第21条地址线(也就是A20)上做了一个开关,当这个开关打开时,这条地址线和其它地址线一样可以使用,当这个开关关闭时,第21条地址线(A20)恒为0,这个开关就叫做A20 Gate,很显然,在实模式下要访问高端内存区,这个开关必须打开,在保护模式下,由于使用32位地址线,如果A20恒等于0,那么系统只能访问奇数兆的内存,即只能访问0--1M、2-3M、4-5M......,这显然是不行的,所以在保护模式下,这个开关也必须打开。
下面我们来看一下PC机是怎么实现A20 Gate的。
早期的PC机,控制键盘有一个单独的单片机8042,现如今这个芯片已经给集成到了其它大片子中,但其功能和使用方法还是一样,当PC机刚刚出现
A20 Gate的时候,估计实在找不到控制它的地方了,同时为这点小事也不值得增加芯片,于是工程师使用这个8042键盘控制器来控制A20 Gate,但A20 Gate 真的和键盘一点关系也没有,我们先从软件的角度简单介绍一下8042这个芯片。
8042有4个寄存器
•1个8-bit长的Input buffer;Write-Only;
•1个8-bit长的Output buffer;Read-Only;
•1个8-bit长的Status Register;Read-Only;
•1个8-bit长的Control Register;Read/Write。
有两个端口地址:60h和64h。
•读60h端口,读output buffer
•写60h端口,写input buffer
•读64h端口,读Status Register
对Control Register的操作相对要复杂一些,首先要向64h端口写一个命令(20h为读命令,60h为写命令),然后根据命令从60h端口读出Control Register 的数据或者向60h端口写入Control Register的数据(64h端口还可以接受许多其它的命令)。
先来看看Status Register的定义,我们后面要用bit 0和bit 1:
bit meaning
-----------------------------------------------------------------------
0 output register (60h) 中有数据
1 input register (60h/64h) 有数据
2 系统标志(上电复位后被置为0)
3 data in input register is command (1) or data (0)
4 1=keyboard enabled, 0=keyboard disabled (via switch)
5 1=transmit timeout (data transmit not complete)
6 1=receive timeout (data transmit not complete)
7 1=even parity rec'd, 0=odd parity rec'd (should be odd)
除了这些资源外,8042还有3个内部端口:Input Port、Outport Port和Test Port,这三个端口的操作都是通过向64h发送命令,然后在60h进行读写的方式完成,其中本文要操作的A20 Gate被定义在Output Port的bit 1上,所以我们有必要对Outport Port的操作及端口定义做一个说明。