在DOS实模式下直接存取4GB内存_第1页
在DOS实模式下直接存取4GB内存_第2页
在DOS实模式下直接存取4GB内存_第3页
在DOS实模式下直接存取4GB内存_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在DOS实形式下直接存取4GB内存作为软件开发人员,大多数对于保护形式都感到神秘和不易理解。本人在开发32位微内核抢占式多线程操作系统过程中,深化理解到PU的地址机理,在这里将分析PU的工作原理,解开保护形式的神秘面纱,读者将会发现保护形式其实与实形式一样简单和易于控制。在此根底上用四五十行语言程序做到进出保护形式和在实形式之下直接访问整个4GB内存空间。虽然有许多书籍对保护形式作解释,但没有一本能简单明了地解释清楚,冗长烦杂的术语让人看着想打瞌睡,甚至还有许多用汇编写的(可能根本不能运行的)保护形式试验程序,事实上用语言本身就可以做保护形式的进出工作。我们可能知道PU上电后从R中的BIS开场

2、运行,而Intel文档却说80 x86UP上电总是从最高内存下16字节开场执行,那么BIS是处在内存的最顶端64K(FFFF0000H)还是1之下的64K(F0000H)处呢?事实上在这两个地方都同时出现(可用后面存取4GB内存的程序验证)。为什么?为了弄清楚以上问题,首先要理解PU是如何处理物理地址的?真的是在实形式下用段存放器左移4位与偏移量相加,在保护形式下用段描绘符中的基地址加偏移量而两者是毫无关联的吗?答案是两者其实是一样的。当Intel把80286推出时其地址空间变成了24位,从8086的20位到24位,非常自然地要加大段存放器才行,实际上它们都被加大了,只是由于保护的原因加大的局

3、部没有被程序看见,到了80386之后地址又从24位加大到32位(80386SX是24位)。整个段存放器如下列图所示:12A08400.GIF;图1在8086中PU只有“看得见局部,从而也直接参与了地址形成运算,但在80286之后,在“看不见局部中已经包含了地址值,“看得见局部就退化为只是一个标号再也不用参与地址形成运算了。地址的形成总是从“不可看见局部取出基址值与偏移相加形成地址。也就是说在实形式下当一个段存放器被装入一个值时,“看不见局部的界限被设成FFFFH,基址局部才是要装入值左移4位,属性局部设成16位0特权级。这个过程与保护形式时装入一个段存器是同理的,只是保护形式的“不可见局部是从

4、描绘表中取值,而实形式是一套固定的过程。对于PU在形成地址时,是没有实形式与保护形式之分的,它只管用基址(“不可见局部)去加上偏移量。实形式与保护形式的差异实际上只是保护处理部件是否工作得更准确而已,比方不允许代码段的写入。实形式下的段存放装入有固定的形成方法从而也就不需要保护形式的“描绘符了,因此保持了与8086/8088的兼容性。而“描绘符也只是为了装入段存放器的“不可见局部而设的。从上面的“整个段存放器可见PU的地址形成与“看得见局部的当前值毫无关系,这也解释了为什么在刚进入保护形式时后面的代码仍然被正确地运行而这时代码段存放器S的值却还是进入保护形式前的实形式值,或者从保护形式回到实形

5、式时代码段S被改变之前程序是正常地工作,而不会“突变到S左移4位的地址上去,比方在保护形式时S是08H的选择器,到了实形式时S还是08H但地址不会突然变成80H加上偏段量中去。因为地址的形成不理睬段存放器“看得见局部的当前值,这一个值只是在被装入时对PU有用。地址的形成与PU的工作形式无关,也就是说实形式与0特权级保护形式不分页时是一模一样的。明白了这一机理,在实形式下一样可以处理通常被认为只有在保护形式才能做的事,比方访问整个机器的内存。可以不必理睬保护形式下的众多术语,或者更易于理解,如选择器就是“看得见局部,描绘符是为了装入“不可见局部而设的。作为验证PU的这种机理,这里写了一个实形式下

6、访问4GB内存的程序。有一些书籍也介绍有同样功能的汇编程序,但它们都错误地认为是利用80386芯片的设计疏漏。实际上Intel本身就在使用这种方法,使得PU上电时能从FFFFFFF0H处开场第一条指令,这种技术在286之后的每一台机器每一次冷启动时都使用,只是我们不知道罢了。PU上电也整个代码段存放器是这样的:12A08401.GIF;图2EiP=0000FFF0H这样SEIP形成了FFFFFFF0H的物理地址,当PU进展一次远跳转重新装入S时,基址就变了。为了访问4G内存空间,必须有一个段存放器的“不可见局部的界限为4G-1,基址为0,这样就包含了4GB内存,不必理睬可见局部的值。显然要让段

7、存放器在实形式下直接装入这些值是不可能的。唯一的方法是让PU进入一会儿保护形式在装入了段存放器之后马上回到实形式。进入保护形式非常简单,只要建好GDT把R存放器的位0置上1,PU就在保护形式了,从前面所分析PU地址形成机理可知,这时不必理睬存放器的“看得见局部值是否合法,各种段存放器是一样可用的,就像没进保护形式一样。在把一个包含有4GB地址空间的值装入某个段存放器之后就可返回实形式。预先可建好GDT如下:unsignedlngGDT-Table=0,0,/空描绘符,必须为零0 x0000FFFF,0 xF9A00,/32位平面式代码段0 x0000FFFF,0 xF9200,/32位平面式数

8、据段只是为了访问数据的话只要2个GDT就足够了,因为并没有重装代码段,这里给出3个GDT只是为了完好性。通常在进入保护形式时要关闭所有的中断,把IDTR的界限设置为0,PU自动关闭所有中断,包括NI,返回实形式后恢复IDTR并开中断。另外A20地址线的控制对于正确访问整个内存也很重要,在进入保护形式前要让8042翻开A20地址线。在这个例子里FS段存放器设成可访问4GB内存的基址和界限,由于在DS中很少有程序会用到GS、FS这两个386增加的段存放器,当要读写4GB范围中的任一个地方都可通过FS段来到达,直到FS在实形式下被重装入冲掉为止。这个例子在386SX、386DX、486上都运行通过。

9、例子里加有非常详细的注释,由于这一程序是用B3.1编译连接的,而其连接器不能为DS程序处理32位存放器,所以直接在代码中参加操作码前缀0 x66和地址前缀0 x67,以便让DS实形式下的16位程序可用32位存放器和地址。程序的右边以注释形式给出等效的32位指令。要注意16位的指令中val,byteptrBX的指令码正好是32位的指令val,byteptrEDI。读者可用这个程序验证BIS是否同时在两个区域出现。假如有线性定址才能的VESA显示卡(如TVGA9440)还可进一步验证线性显示缓冲区在1B之上的工作情况。#inludeds.hunsignedlngGDT-Table=0,0,/NUL

10、L-00H0 x0000FFFF,0 x00F9A00,/de32-08hBase=0Liit=4G-1Size=4G0 x0000FFFF,0 x00F9200/Data32-10hBase=0Liit=4G-1Size=4G;unsignedharldIDT6=0;/SaveTheIDTRbefreEnterPrtetde.unsignedharpdesr-tp6=0;/NULLTheIDTRsLiit=0PUill/disableallInterrupts,inludeNI.#defineKeyait()hile(inprtb(0 x64)2);vidA20Enable(vid)keya

11、it();utprtb(0 x64,0 xD1);Keyait();utprtb(0 x60,0 xDF);/EnableA20ith8042.Keyait();utprtb(0 x64,0 xFF);Keyait();vidLadFSLiit4G(vid)A20Enable();/EnableA20/*DisableintsNullIDT/*asLI/DisableinerruptsSIDTldIDT/SaveLDIDTRLIDTpdesr-tp/SetupeptyIDT.Disableanyinterrupts,/InludeNI./*LddGDTR/*as/TherightdeisRea

12、l,ButB+sLinkerNT/rkith32bitsde.db0 x66/32bitperatinPrefixin16BitDS.VX,DS/VEX,DSdb0 x66/GetDatasegentphysialAddressSHLX,4/SHLEX,4Vrdptrpdesr-tp0,(3*8-1)/Vrdptrpdesr-tp0,(3*8-1)db0 x66XRAX,AX/XREAX,EAXVAX,ffsetGDT-Table/VAX,ffsetGDT-Tabledb0 x66ADDAX,X/ADDEAX,EXVrdptrpdesr-tp2,AX/GDTRBasel16bitsdb0 x6

13、6SHRAX,16/SHREAX,16Vrdptrpdesr-tp4,AX/GDTRBasehigh16bitsLGDTpdesr-tp/LadGDTR/*/*Enter32bitFlatPrtetedde/*asvDX,0 x10/TheData32Seletrdb0 x66,0 x0F,0 x20,0 x0/VEAX,R0db0 x66VBX,AX/VEBX,EAXRAX,1db0 x66,0 x0F,0 x22,0 x0/VR,EAX/SetPrtetinenablebitJPFlsuh/learahineperfrahe.flush:/NInFlatde,ButTheSisRealde

14、Value.as/Anditsattribis16BitdeSegent.db0 x66VAX,BX/VEAX,EBXdb0 x8E,0 xE2/VFS,DX/LadFSBase=0Size=4Gndb0 x66,0 x0F,0 x22,0 x0/VR,EAX/ReturnRealde.LIDTldIDT/LIDTldIDT/RestreIDTRSTI/STI/EnableINTRunsignedharReadByte(unsignedlngAddress)asdb0 x66asvdi,rdptrAddress/VEDI,Addressasdb0 x67/32bitAddressPrefixa

15、sdb0 x64/FS:asval,byteptrBX/=VAL,FS:EDIreturn-AL;unsignedharriteByte(unsignedLngAddress)asdb0 x66asvdi,rdptrAddress/VEDI,Addressasdb0 x67/32bitAddressPrefixasdb0 x64/FS:asvbyteptrBX,al/=VFS:EDI,ALreturn-AL;/DntTuhAbvede/#inludestdi,hvidDup4G(unsignedlngAddress)inti;intj;fr(i=0;i20;i+)printf(“%081X:,(Address+i*16);fr(j=0;j16;j+)printf(%02X,ReadByte(Address+i*16+j);printf();fr(j=0;j16;j+)if(ReadByte(Address+i*16+j)0 x20)printf(.);elseprintf(%,ReadByte(Address+i*16+j);printf(n);ain()unsignedlngAddress=0;unsignedlngtp;LadFSLiit4G();printf(=DesignedBySuthern.19

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论