




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2.4 【实例】:在DOS实模式下读取4GB内存(1)为了帮助读者实际了解以上所介绍的一些概念,下面我们来分析一段在DOS实模式下直接读取4GB内存的代码。通过该程序来分析CPU 的工作原理,揭开保护模式的神秘面纱,读者将会发现,保护模式其实与实模式一样简单和易于控制。在此基础上用四五十行C 语言程序做到进出保护模式和在实模式之下直接访问整个4GB内存空间。这个访问4GB内存的程序是在实模式下使用的,它只是让CPU中的不可见部分有4GB大小访问权限。在进入保护模式(CR0成为1)后,如果段寄存器不发生变化的话,则一切和实模式一样。所以CPU的保护位为1时,后面的代码依然可以执行,而不是死机状态
2、。同样的方法就不能用于分页,如果分页后的内存与不分页前时对于执行的地方发生不同,如分页的指令在内存0X12345处,分页后这个地方可能变成不存在,则计算机就只有出错重启。对于这个问题,本人做过多次实验,屡试不爽。2.4.1 程序的意义此程序具有如下功能:Ø 不需要在保护模式状态下就可以直接把386的4GB内存读出来;Ø 利用此程序可直接在DOS中做物理设备的检测;Ø
3、; 理解GDT表的对应关系后,所谓386 32位模式也就很容易理解;Ø 在DOS下,可根据此类方法将中断向量表移到任意位置,达到反跟踪或其他等目的。2.4.2 程序代码程序代码如下所示。#include <dos.h>/4G Memory Access/This Program Can Access 4G Bytes in DOS Real/Mode,Needn't in Protect
4、ion Mode It Works./The Program Enter 32 Bit Flat Mode a moment and/Only Load FS a 32 Bit Flat Mode Selector,Then Return/Real Mode./Used The FS Can Access All 4G Memory till It be/reloaded./unsigned longGDT_Table=0, 0, /NULL - 00H0x0000FFFF,0x00CF9A00,/Code32 - 08H Base=0 /Limit=4G-1 Size=4G0x0000FFF
5、F,0x00CF9200/Data32 - 10H Base=0 /Limit=4G-1 Size=4G;/Save The IDTR before Enter Protect Mode.unsigned charOldIDT6=0;/NULL The IDTR,IDTR's Limit=0 will disable all /Interrupts,include NMI.unsigned charpdescr_tmp6=0;#defineKeyWait()while(inportb(0x64)&2);voidA20Enable(void)KeyWait();outportb(
6、0x64,0xD1);KeyWait();outportb(0x60,0xDF);/Enable A20 with 8042.KeyWait();outportb(0x64,0xFF);KeyWait();voidLoadFSLimit4G(void)A20Enable();/Enable A20/*/* Disable ints & Null IDT */*asmCLI /Disable inerruptsSIDTOldIDT/Save OLD IDTRLIDTpdescr_tmp/Set up empty IDT.Disable any/interrupts,/Include NM
7、I./*/* Load GDTR*/*asm /The right Code is Real,But BC+'s Linker NOT Work /with 32-bits Code.db0x66/32 bit Operation Prefix in 16 Bit DOS.MOVCX,DS/MOVECX,DSdb0x66/Get Data segment physical AddressSHLCX,4/SHLECX,4MOVword ptr pdescr_tmp0,(3*8-1)/MOVword ptr pdescr_tmp0,(3*8-1)db0x66XORAX,AX/XOREAX,
8、EAXMOVAX,offset GDT_Table/MOVAX,offset GDT_Tabledb0x66ADDAX,CX/ADDEAX,ECXMOVword ptr pdescr_tmp2,AX/GDTR Base high16 bitsdb0x66SHRAX,16/SHREAX,16MOVword ptr pdescr_tmp4,AX/GDTR Base high16 bitsLGDTpdescr_tmp/Load GDTR/*/* Enter 32 bit Flat Protected Mode */*/Set CR0 Bit-0 to 1 Enter 32 Bit Protectio
9、n/Mode,And NOT Clear machine perform cache,It Meaning/the after Code HAD Ready To RUN in 32 Bit Flat Mode,/Then Load Flat Selector to FS and Description into it's/Shadow register,After that,ShutDown Protection Mode/And ReEnter Real Mode immediately./The FS holds Base=0 Size=4G Description and/it
10、 can Work in Real Mode as same as Pretect Mode,/untill FS be reloaded./In that time All the other Segment Registers are/Not Changed,except FS.(They are ERROR Value holded in CPU).asmMOVDX,0x10/The Data32 Selectordb0x66,0x0F,0x20,0xC0/MOVEAX,CR0db0x66MOVBX,AX/MOVEBX,EAXORAX,1db0x66,0x0F,0x22,0xC0/MOV
11、CR0,EAX/Set Protection enable bitJMPFlush/Clear machine perform cache.Flush:/Now In Flat Mode,But The /CS is Real Mode Value.asm /And it's attrib is 16-Bit Code /Segment.db0x66MOVAX,BX/MOVEAX,EBXdb0x8E,0xE2/MOVFS,DX/Load FS nowdb0x66,0x0F,0x22,0xC0/MOVCR0,EAX/Return Real Mode.Now FS's Base=0
12、 Size=4GLIDTOldIDT/LIDTOldIDT Restore IDTRSTI/STIEnable INTR/With FS can Access All 4G Memory Now.But if FS be reloaded /in Real Mode It's Limit will Be Set to FFFFh(Size=64K),/then Can not used it/ to Access 4G bytes Memory Again,Because FS is Segment:Offset/Memory type after that./If Use it to
13、 Access large than 64K will generate Execption 0D./unsigned charReadByte(unsigned long Address)asmdb0x66asmmovdi,word ptr Address/MOVEDI,Addressasmdb0x67/32 bit Address Prefixasmdb0x64/FS:asmmoval,byte ptr BX/=MOV AL,FS:EDIreturn_AL;unsigned charWriteByte(unsigned long Address)asmdb0x66asmmovdi,word
14、 ptr Address/MOVEDI,Addressasmdb0x67/32 bit Address Prefixasmdb0x64/FS:asmmovbyte ptr BX,al/=MOV FS:EDI,ALreturn_AL;/ Don't Touch Above Code /#include <stdio.h>/打印出Address指向的内存中的数据/voidDump4G(unsigned long Address)inti;intj;for(i=0;i<20;i+)printf("%08lX: ",(Address+i*16);for(j
15、=0;j<16;j+)printf("%02X ",ReadByte(Address+i*16+j);printf(" ");for(j=0;j<16;j+)if(ReadByte(Address+i*16+j)<0x20) printf(".");elseprintf("%c",ReadByte(Address+i*16+j);printf("n");main()charKeyBuffer256;unsigned long Address=0;unsigned longtmp
16、;LoadFSLimit4G();printf("=Designed By Southern.1995.7.17=n");printf("Now you can Access The Machine All 4G Memory.n");printf("Input the Start Memory Physical to DUMP.n");printf("Press D to Cuntinue DUMP,0 to End & Quit.n");doprintf("-");gets(KeyB
17、uffer);sscanf(KeyBuffer,"%lX",&tmp);if(KeyBuffer0='q') break;if(KeyBuffer0='d') Address+=(20*16);else Address=tmp;Dump4G(Address);while(Address!=0);return 0;程序运行后,等用户从键盘输入一个字符。当输入“Q”字符时,整个程序将退出,当输入“D”时,将在屏幕上显示一屏内存的数据,最左边为绝对地址,其后一列显示的是以十六进制位表示的内存的数据,后一列是数据所对应的ASCII码。2.4
18、【实例】:在DOS实模式下读取4GB内存(2) 2.4.3 程序原理我们知道,CPU上电后,从ROM 中的BIOS开始运行,而Intel 文档却说80x86 CPU上电总是从最高内存下16字节开始执行,那么,BIOS是处在内存的最顶端64KB(FFFF0000H),还是1MB之下的64KB(F0000H)处呢?事实上,BIOS在这两个地方都同时出现(可用后面存取4GB 内存的程序验证)。为了弄清楚以上问题,首先要了解CPU 是如何处理物理地址的。真的是在实模式下用段寄存器左移4位与偏移量相加,还是在保护模式下用段描述符中的基地址加偏移量,难道两者
19、是毫无关联的吗? 答案是两者其实是一样的。当Intel把80286推出时,其地址空间变成了24位,则从8086的20位到24位,十分自然地要加大段寄存器才行。实际上,段寄存器和指针都被加大了,只是由于保护的原因,加大的部分没有被程序看见,到了80386之后,地址又从24位加大到32位(80386 SX是24位)。在8086中,CPU只有“看得见部分”,但在80286之后,在“看不见部分”中已经包含了地址值,“看得见部分”就退化为只是一个标号,再也不用参与地址形成运算了。地址的形成总是从“不可看见部分”取出基址值与偏移相加形成地址。也就是说,在实模式下,当一个段寄存器被装入一个值时,“看不见部分
20、”的界限被设成FFFFH,基址部分将装入值左移4位,属性部分设成16位0特权级。这个过程与保护模式时装入一个段寄存器是同理的,只是保护模式的“不可见部分”是从描述表中取值,而实模式是一套固定的过程。 对于CPU在形成地址时,是没有实模式与保护模式之分的,它只管用基址(“不可见部分”)去加上偏移量。实模式与保护模式的差别实际上只是保护处理部件是否工作得更精确而已,比如不允许代码段的写入。实模式下的段寄存装入有固定的形成办法,从而也就不需要保护模式的“描述符”了,因此,保持了与8086/8088的兼容性。而“描述符”也只是为了装入段寄存器的“不可见部分”而设的。 从上面的“整个段寄存器”可见,CP
21、U的地址形成与“看得见部分”的当前值毫无关系。这也解释了为什么在刚进入保护模式时,后面的代码依然被正确地运行,而这时代码段寄存器CS的值却还是进入保护模式前的实模式值,或者从保护模式回到实模式时,代码段CS被改变之前程序是正常地工作,而不会“突变”到CS左移4位的地址上去。比如在保护模式时,CS是08H的选择子,到了实模式时,CS还是08H,但地址不会突然变成80H加上偏移量。因为地址的形成不理会段寄存器“看得见部分”的当前值,这一个值只是在被装入时对CPU有用。地址的形成与CPU的工作模式无关,也就是说,实模式与0特权级保护模式不分页时是一模一样的。明白了这一机理后,在实模式下一样可以处理通
22、常被认为只有在保护模式才能做的事,比如访问整个机器的内存。不必理会保护模式下的众多术语或许会更易于理解,如选择子就是“看得见部分”,描述符是为了装入“不可见部分”而设的。有一些书籍也介绍有同样功能的汇编程序,但它们都错误地认为是利用80386芯片的设计疏漏。实际上,Intel本身就在使用这种办法,使得CPU上电时能从FFFFFFF0H处开始第一条指令,这种技术在286之后的每一台机器每一次冷启动时都使用,只是我们不知道罢了。 2.4.4 程序中的一些解释下面对程序做几点说明。(1)IP=0000FFF0H 通过这样设置,CSEIP就形成了FFFFFFF0H的物理地址,当CPU进行一次远跳转重新装入CS时,基址就变了。 (2)为了访问4GB内存空间,必须有一个段寄存器的“不可见部分”的界限为4G-1,基址为0,这样就包含了4GB内存,不必理会“可见部分”的值。显然要让段寄存器在实模式下直接装入这些值是不可能的。惟一的办法是让CPU进入一会儿保护模式,在装入了段寄存器之后马上回到实模式。 进入保护模式十分简单,只要建好GDT,把CR0寄存器的位0置上1,CPU就在保护模式了。从前面分析CPU地址形成机理可知,这时不必理会寄存器的“看得见部分”值是否合法,各种段寄存器是一样可用的,就像没进保
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内混色喷射技术发展趋势内混色喷射稳定性研究考核试卷
- 农业机械化项目风险管理法律框架分析考核试卷
- 信托资本补充中的股权激励计划设计研究考核试卷
- 培训项目可持续性评估标准考核试卷
- 2024年新疆泽普县急诊医学(副高)考试题含答案
- 新疆新冠管理办法
- 政府采供管理办法
- 2024年天津市宁河区急诊医学(副高)考试题含答案
- 拉萨苗木管理办法
- 2024年四川省宜宾县普通外科学(副高)考试题含答案
- GB/T 15601-2013管法兰用金属包覆垫片
- GB/T 13660-2008201×7强碱性苯乙烯系阴离子交换树脂
- CB/T 702-1992船用柴油机铸铁气缸套技术条件
- 医学影像诊断中常见疾病的CT、MRI诊断
- 函数的奇偶性 省赛一等奖 公开课教学设计
- 日间手术管理信息系统功能参数
- 物料吊笼安全技术标准
- 桥梁承载能力检测评定报告
- 临床输血护士工作流程
- 印刷过程中印刷品脏污等印迹质量故障的原因分析
- 电气运行值班员职业二级技能签定实操技能试题
评论
0/150
提交评论