-
-
[原创]8086实模式寻址演义
-
发表于:
2010-6-14 18:48
9443
-
对于8088实模式寻址,教科书上只讲:16+4=20位,所以16位段地址左移4位+16位偏移=20位物理地址。很多人也只是死记,其实并不知道其含义,而且还会感到晕,怎么16位左移4位,再加16位偏移就成20位了?
下面从一个故事说起。
一个鲜为人知的故事
============
现在,人们都知道Intel和Microsoft是多么的伟大,如果真正了解他们的成长过程,你就会发现他们也很普通,甚至不怎么样。就象周恩来等中共精英,当初会愚蠢的把红军指挥权交给一个德国人,而让红军一败涂地一样,放到现在别的不说,一个卖国、勾结什么反华势力就能把他们淹死!
扯远了,拉回来。IBM决定使用8088芯片开发IBM PC,及盖茨要为建议的IBM PC生产一个操作系统的时候,英特尔警告他们两个,说你们不要用那个,我们正在开发一款新的16位CPU(80286),你们用8088会后悔的。
然而, 由于IBM和盖茨都不知道PC计算机操作系统是怎么会事,所以他们不听。盖茨在华盛顿从一个公司买了一个操作系统。(西雅图电脑产品)的这个 OS被称为QDOS(快速和肮脏的操作系统),它基本是由三位前DRI(Digital Research Inc數位研究公司)的人为8086开发的,这三个人成立了这家新公司,并基本上复制了CP/M,并把它转换为16位,使用和增加了内存容量(从64K到量1024K)。然而,当它被开发成16位 CP/M时,它不是写给保护模式的。后来盖茨把它针对IBM做了很少的小改动,改名为像86-DOS或DOS-86或类似的东西。它基本上是专为CP/M 用户设计的。事实上,第一台IBM个人电脑(他们被称为个人电脑之前)吹嘘说CP/M的程序可以在其上运行。-----瞧瞧是不是优点欺诈和奸商的味道?所以在很长时间unix、OS/2的开发人员都认为DOS根本就谈不上是真正的操作系统。
8086/8088的寻址问题
===============
8088和80286都是16位CPU,Intel当初为什么会警告IBM和盖茨呢?到底发生了什么?
要了解发生了什么,我们要看看处理器的内部,会看到巨大的差异。首先,你找一片8088CPU,把包装磨掉,磨到CPU硅片,放到显微镜下,你会看到8086/88的内部结构,它根本不是一个新的设计,而是两个并联运行的8085(8位)微处理器再多那么一点点。
每个8085有它自己的8位数据和16位寻址能力。结合2个8位数据寄存器假装16位寄存器很容易。事实上这没有任何新东西,RCA COSMAC微处理器就使用16个8位寄存器,可作为内部的8位或16位寄存器使用,你可以有多达16个8位寄存器或8个16位寄存器或两者的任何组合。现在,一个中国的普通IC厂都可以轻易设计的出来。
可能由于受当时生产工艺所限,8088只能有40个脚,intel的设计“精英”左思右想,确定了20条地址线(1M的寻址空间),而且16条数据线还要和20条地址线中的16条复用(分时复用,即一会是地址线,一会是数据线,对此要想了解,可看8088芯片手册的时序部分,也可看8052单片机书籍,它的地址线和数据线也是复用的)。
到了问题的实质了,8088内的两个8085各有一套16位寻址寄存器,如何让他们寻址20位的1M地址呢?其实把他们并在一起形成32位寻址很简单,如果是那样后来的很多麻烦可能就都没有了(如A20门),但当时那些“精英”可能认为32位寻址(4G地址空间)那是扯淡,估计地球消失了也用不到那么多的内存吧?再说了老板逼的又紧,于是他们采用了在一个硬件上使用两个8085非常好实现的方法--分段:
他们把1024K地址空间分成16字节的段,共64K个段,用一个8085的16位寻址寄存器作地址偏移寄存器(故段的长度是64K),而另一个8085的16位寻址寄存器作16字节段的段地址寄存器,注意,他保存的不是16字节段的地址,而是16字节段的序号(0,1,...65535)。
这样做的好处是:只要在两8085CPU之间加一个移位器和一个20位的加法器,就可以完成20位的地址寻址--一个8085的地址寄存器(段地址--就是16字节段的序号)左移4位(*16 = 16字节小段的首地址),加上另一个8085的地址寄存器就可以啦,哈哈!可以向老板交差了,制作成本低,设计速度快,有钱不抢是孙子!至于以后,。。。。
其实,段的大小从16-64K字节都可以通过类似方法实现1M寻址,为什么那帮精英非选16字节呢?因为,16字节的段,形成地址时段寄存器的位移最少,最好实现。
大家想想,要是实现32位寻址,则需要在两个8085间加一个乘法器,但是如果实现了软件开发人员会省多少事。。。。,另外,要知道直到64位CPU才突破32位地址空间的限制。
教科书上只讲:16+4=20位,所以16位段地址左移4位+16位偏移=20位物理地址。很多人也只是死记,其实并不知道其含义,而且还会感到晕,怎么16位左移4位,再加16位偏移就成20位了?
其商业、职业含义是应付、凑伙,并带点糊弄,用褒义词,最多也是用最小的成本、最快的速度占领市场,决不是技术上精益求精。其理论实质是:分段,1024K分成64k个16字节的段,段寄存器保存的不是段的首地址,而是段的序号。不知为什么,教科书上从来不这样叙述。
到了80286,不只是为了抢占市场搞的手忙脚乱,还是8088的底子太差,以至于80286的设计复杂系数太高,还是其他什么原因,intel们又犯了两个非常低级的错误,以至于80286有两个重大缺陷:
首先,他声称80286兼容8086/8088实模式,但是在实模式地址达到1024K顶端时且不能回绕,而8088事回绕的,即地址到达FFFFFH时,再增加要回到0。
于是,产生了A20门这个痛苦问题,致使IBM不得不非常龌龊的通过键盘控制器来A20地址线的高低,从而实现实模式下的地址回绕,以便和8088兼容。这个问题后来又不断演化(专门写出来就可长篇大论),并长期给软件开发人员带来不小的麻烦。
第二, 80286从实模式进入保护模式后没有办法退回实模式,必须复位才行! 80286有16M的存储空间,但实模式只能访问1M,也就是说,要使用1M以上的内存,必须切换到保护模式,可是要回来必须复位CPU,这对实模式下程序员是怎么一种折磨和酷刑呀?当然,到了386这个问题得到了解决,然而,至今,A20门则一直存在。
看看80286的bios设计人员是如何进行内存自检的,PC启动时,bios先在实模式执行其他应该执行的程序,到了内存自检时,首先切换到保护模式,但完成内存自检,然后在键盘控制器中设一些标志,复位CPU, bios重新执行,但会检查键盘控制器中的标志,发现是bios的热复位,则跳到复位的地方接着执行。
Intel这个技术帝国的独裁者捆绑的这个技术帝国的既得利益者(如,IBM、Microsoft等),竞把如此糟糕的80286退给消费者,可见技术垄断的危害性。
Intel、microsoft等之所以高深、神秘、伟大,完全在于被他们洗脑或自己给自己洗脑的大众把他们高深、神秘、伟大了,而他们本身,初期量仅仅是占据了一点点先机的普通人,当揭开他们的内幕,远没有人们认为的那样高深、神秘、伟大,甚至还充满了龌龊。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!