zoukankan      html  css  js  c++  java
  • 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)

    【-1】写在前面:

    以下部分内容总结于 http://blog.csdn.net/ruyanhai/article/details/7181842

    complementary: 兼容性是指运行在前期CPU,如8086/8088上的的程序,也可以运行在其以后的处理器,如80286上;


    【0】看看intel处理器的发展历程

    这里写图片描述


    【1】8086/8088的寻址和问题

    1.1)寻址:在8086/8088中,只有20根地址总线,所以可以访问的地址是2^20=1M,但由于8086/8088是16位地址模式,能够表示的地址范围是0-64K,所以为了在8086/8088下能够访问1M内存,Intel采取了分段的模式:16位段基地址:16位偏移。其绝对地址计算方法为:16位基地址左移4位+16位偏移=20位地址;(这个比较简单)

    1.2)问题: 但这种方式引起了新的问题,通过上述分段模式,能够表示的最大内存为:FFFFh:FFFFh=FFFF0h+FFFFh=10FFEFh=1M+64K-16Bytes(1M多余出来的部分被称做高端内存区HMA)。但8086/8088只有20位地址线,如果访问100000h~10FFEFh之间的内存,则必须有第21根地址线。所以当程序员给出超过1M(100000H-10FFEFH)的地址时,系统并不认为其访问越界而产生异常,而是自动从重新0开始计算,也就是说系统计算实际地址的时候是按照对1M求模的方式进行的,这种技术被称为wrap-around。


    【2】80286的寻址和问题

    2.0)寻址: 到了80286,系统的地址总线发展为24根,这样能够访问的内存可以达到2^24=16M。Intel在设计80286时提出的目标是,在实模式下,系统所表现的行为应该和8086/8088所表现的完全一样,也就是说,在实模式下,80286以及后续系列,应该和8086/8088完全兼容;

    2.1)问题:如果程序员访问100000H-10FFEFH之间的内存,80286将实际访问这块内存,而不是像过去一样重新从0开始,因为80286有这个寻址能力,但是这就不能满足和8086/8088的系统兼容性,因为8086/8088不能访问到100000H-10FFEFH之间的内存的真实地址而是按照对1M求模的内存寻址方式;


    【3】再浅谈80286 和 8086/8088 间的兼容性问题:(实模式下,80286的系统表现要同8086/8088的一致)

    3.1)当A20被禁止时:程序员给出100000H~10FFEFH间的地址,80286和8086/8088 的系统表现是一致的,即按照对1M求模的方式进行寻址,满足系统升级的兼容性问题;

    3.2)当A20被开启时:程序员给出的100000H~10FFEFH间的地址,80286是访问的真实地址,而8086/8088是始终是按照对1M求模的方式进行的(这里注意,是始终);


    【4】解决方法:

    为了解决上述问题,IBM使用键盘控制器上剩余的一些输出线来管理第21根地址线(从0开始数是第20根),被称为A20Gate:如果A20 Gate被打开,则当程序员给出100000H-10FFEFH之间的地址的时候,系统将真正访问这块内存区域;如果A20Gate被禁止,则当程序员给出100000H-10FFEFH之间的地址的时候,系统仍然使用8086/8088的方式。


    【5】有请实模式+保护模式闪亮登场(干货)

    5.1)实模式:实模式就是, 为了实现系统升级的兼容性,如80286的系统表现(包括80286以后的CPU)要与8086/8088 的系统表现一致,就需要80286 CPU访问100000H-10FFEFH之间的地址的时候, 按照对1M求模的方式进行, 无论A20地址线开启关闭与否, 这种内存访问情况 称为实模式;

    5.2)保护模式:保护模式就是, 以A20地址线开启为前提,80286 CPU访问100000H-10FFEFH之间的地址的时候, 是访问真实的内存地址,不是求模访问,如访问100001H,就是真真切切地 访问 0x 100001H,而不是求模的 0x000001H 地址, 这种内存访问情况称为保护模式;

    5.3)诞生日: 实模式是从8088/8086 就开始存在了, 而保护模式从 80286 才开始存在;


    【6】为什么需要保护模式?(因为实模式与生俱来,是伴随着8088/8086 从天而降的,它仅仅是访问内存的一种方式而已; 还有对于8086/8088而言,它只有实模式这一种内存寻址方式,而对于80286包括其以后的CPU,有实模式和保护模式两种寻址方式,因为要兼顾系统兼容性)

    显然随着CPU的升级,8088/8086的内存寻址方式已经无法满足需要,也可以说,为了能够访问10FFEFH以上的内存,则必须进入保护模式;


    【7】A20被禁止+被开启的不同结果

    7.1)如果A20Gate被禁止:对于80286来说,其地址为24bit,其地址表示为EFFFFF;对于80386极其随后的32-bit芯片来说,其地址表示为FFEFFFFF。这种表示的意思是如果A20Gate被禁止,则其第20-bit在CPU做地址访问的时候是无效的,永远只能被作为0;

    7.2)如果A20 Gate被打开:则其第20-bit是有效的,其值既可以是0,又可以是1;

    7.3)所以:在保护模式下,如果A20 Gate被打开,则可以访问的内存则是连续的;如果A20Gate被禁止,则可以访问的内存只能是偶数段,

    因为是20位(从0始)总为零,所23~20位只能是0000、0010、0100、0110、1000、1010、1100、1110对应十六进制为0、2、4、6、8、A、C、E。对应的十六进制地址段是000000-0FFFFF,200000-2FFFFF,400000-4FFFFF…

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    gThumb 3.1.2 发布,支持 WebP 图像
    航空例行天气预报解析 metaf2xml
    Baruwa 1.1.2 发布,邮件监控系统
    Bisect 1.3 发布,Caml 代码覆盖测试
    MoonScript 0.2.2 发布,基于 Lua 的脚本语言
    Varnish 入门
    快速增量备份程序 DeltaCopy
    恢复模糊的图像 SmartDeblur
    Cairo 1.12.8 发布,向量图形会图库
    iText 5.3.4 发布,Java 的 PDF 开发包
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893169.html
Copyright © 2011-2022 走看看