版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2.4 【實(shí)例】:在DOS實(shí)模式下讀取4GB內(nèi)存(1)為了幫助讀者實(shí)際了解以上所介紹的一些概念,下面我們來(lái)分析一段在DOS實(shí)模式下直接讀取4GB內(nèi)存的代碼。通過(guò)該程序來(lái)分析CPU 的工作原理,揭開(kāi)保護(hù)模式的神秘面紗,讀者將會(huì)發(fā)現(xiàn),保護(hù)模式其實(shí)與實(shí)模式一樣簡(jiǎn)單和易于控制。在此基礎(chǔ)上用四五十行C 語(yǔ)言程序做到進(jìn)出保護(hù)模式和在實(shí)模式之下直接訪問(wèn)整個(gè)4GB內(nèi)存空間。這個(gè)訪問(wèn)4GB內(nèi)存的程序是在實(shí)模式下使用的,它只是讓CPU中的不可見(jiàn)部分有4GB大小訪問(wèn)權(quán)限。在進(jìn)入保護(hù)模式(CR0成為1)后,如果段寄存器不發(fā)生變化的話,則一切和實(shí)模式一樣。所以CPU的保護(hù)位為1時(shí),后面的代碼依然可以執(zhí)行,而不是死機(jī)狀態(tài)
2、。同樣的方法就不能用于分頁(yè),如果分頁(yè)后的內(nèi)存與不分頁(yè)前時(shí)對(duì)于執(zhí)行的地方發(fā)生不同,如分頁(yè)的指令在內(nèi)存0X12345處,分頁(yè)后這個(gè)地方可能變成不存在,則計(jì)算機(jī)就只有出錯(cuò)重啟。對(duì)于這個(gè)問(wèn)題,本人做過(guò)多次實(shí)驗(yàn),屢試不爽。2.4.1 程序的意義此程序具有如下功能:Ø 不需要在保護(hù)模式狀態(tài)下就可以直接把386的4GB內(nèi)存讀出來(lái);Ø 利用此程序可直接在DOS中做物理設(shè)備的檢測(cè);Ø
3、; 理解GDT表的對(duì)應(yīng)關(guān)系后,所謂386 32位模式也就很容易理解;Ø 在DOS下,可根據(jù)此類方法將中斷向量表移到任意位置,達(dá)到反跟蹤或其他等目的。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指向的內(nèi)存中的數(shù)據(jù)/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;程序運(yùn)行后,等用戶從鍵盤(pán)輸入一個(gè)字符。當(dāng)輸入“Q”字符時(shí),整個(gè)程序?qū)⑼顺?,?dāng)輸入“D”時(shí),將在屏幕上顯示一屏內(nèi)存的數(shù)據(jù),最左邊為絕對(duì)地址,其后一列顯示的是以十六進(jìn)制位表示的內(nèi)存的數(shù)據(jù),后一列是數(shù)據(jù)所對(duì)應(yīng)的ASCII碼。2.4
18、【實(shí)例】:在DOS實(shí)模式下讀取4GB內(nèi)存(2) 2.4.3 程序原理我們知道,CPU上電后,從ROM 中的BIOS開(kāi)始運(yùn)行,而Intel 文檔卻說(shuō)80x86 CPU上電總是從最高內(nèi)存下16字節(jié)開(kāi)始執(zhí)行,那么,BIOS是處在內(nèi)存的最頂端64KB(FFFF0000H),還是1MB之下的64KB(F0000H)處呢?事實(shí)上,BIOS在這兩個(gè)地方都同時(shí)出現(xiàn)(可用后面存取4GB 內(nèi)存的程序驗(yàn)證)。為了弄清楚以上問(wèn)題,首先要了解CPU 是如何處理物理地址的。真的是在實(shí)模式下用段寄存器左移4位與偏移量相加,還是在保護(hù)模式下用段描述符中的基地址加偏移量,難道兩者
19、是毫無(wú)關(guān)聯(lián)的嗎? 答案是兩者其實(shí)是一樣的。當(dāng)Intel把80286推出時(shí),其地址空間變成了24位,則從8086的20位到24位,十分自然地要加大段寄存器才行。實(shí)際上,段寄存器和指針都被加大了,只是由于保護(hù)的原因,加大的部分沒(méi)有被程序看見(jiàn),到了80386之后,地址又從24位加大到32位(80386 SX是24位)。在8086中,CPU只有“看得見(jiàn)部分”,但在80286之后,在“看不見(jiàn)部分”中已經(jīng)包含了地址值,“看得見(jiàn)部分”就退化為只是一個(gè)標(biāo)號(hào),再也不用參與地址形成運(yùn)算了。地址的形成總是從“不可看見(jiàn)部分”取出基址值與偏移相加形成地址。也就是說(shuō),在實(shí)模式下,當(dāng)一個(gè)段寄存器被裝入一個(gè)值時(shí),“看不見(jiàn)部分
20、”的界限被設(shè)成FFFFH,基址部分將裝入值左移4位,屬性部分設(shè)成16位0特權(quán)級(jí)。這個(gè)過(guò)程與保護(hù)模式時(shí)裝入一個(gè)段寄存器是同理的,只是保護(hù)模式的“不可見(jiàn)部分”是從描述表中取值,而實(shí)模式是一套固定的過(guò)程。 對(duì)于CPU在形成地址時(shí),是沒(méi)有實(shí)模式與保護(hù)模式之分的,它只管用基址(“不可見(jiàn)部分”)去加上偏移量。實(shí)模式與保護(hù)模式的差別實(shí)際上只是保護(hù)處理部件是否工作得更精確而已,比如不允許代碼段的寫(xiě)入。實(shí)模式下的段寄存裝入有固定的形成辦法,從而也就不需要保護(hù)模式的“描述符”了,因此,保持了與8086/8088的兼容性。而“描述符”也只是為了裝入段寄存器的“不可見(jiàn)部分”而設(shè)的。 從上面的“整個(gè)段寄存器”可見(jiàn),CP
21、U的地址形成與“看得見(jiàn)部分”的當(dāng)前值毫無(wú)關(guān)系。這也解釋了為什么在剛進(jìn)入保護(hù)模式時(shí),后面的代碼依然被正確地運(yùn)行,而這時(shí)代碼段寄存器CS的值卻還是進(jìn)入保護(hù)模式前的實(shí)模式值,或者從保護(hù)模式回到實(shí)模式時(shí),代碼段CS被改變之前程序是正常地工作,而不會(huì)“突變”到CS左移4位的地址上去。比如在保護(hù)模式時(shí),CS是08H的選擇子,到了實(shí)模式時(shí),CS還是08H,但地址不會(huì)突然變成80H加上偏移量。因?yàn)榈刂返男纬刹焕頃?huì)段寄存器“看得見(jiàn)部分”的當(dāng)前值,這一個(gè)值只是在被裝入時(shí)對(duì)CPU有用。地址的形成與CPU的工作模式無(wú)關(guān),也就是說(shuō),實(shí)模式與0特權(quán)級(jí)保護(hù)模式不分頁(yè)時(shí)是一模一樣的。明白了這一機(jī)理后,在實(shí)模式下一樣可以處理通
22、常被認(rèn)為只有在保護(hù)模式才能做的事,比如訪問(wèn)整個(gè)機(jī)器的內(nèi)存。不必理會(huì)保護(hù)模式下的眾多術(shù)語(yǔ)或許會(huì)更易于理解,如選擇子就是“看得見(jiàn)部分”,描述符是為了裝入“不可見(jiàn)部分”而設(shè)的。有一些書(shū)籍也介紹有同樣功能的匯編程序,但它們都錯(cuò)誤地認(rèn)為是利用80386芯片的設(shè)計(jì)疏漏。實(shí)際上,Intel本身就在使用這種辦法,使得CPU上電時(shí)能從FFFFFFF0H處開(kāi)始第一條指令,這種技術(shù)在286之后的每一臺(tái)機(jī)器每一次冷啟動(dòng)時(shí)都使用,只是我們不知道罷了。 2.4.4 程序中的一些解釋下面對(duì)程序做幾點(diǎn)說(shuō)明。(1)IP=0000FFF0H 通過(guò)這樣設(shè)置,CSEIP就形成了FFFFFFF0H的物理地址,當(dāng)CPU進(jìn)行一次遠(yuǎn)跳轉(zhuǎn)重新裝入CS時(shí),基址就變了。 (2)為了訪問(wèn)4GB內(nèi)存空間,必須有一個(gè)段寄存器的“不可見(jiàn)部分”的界限為4G-1,基址為0,這樣就包含了4GB內(nèi)存,不必理會(huì)“可見(jiàn)部分”的值。顯然要讓段寄存器在實(shí)模式下直接裝入這些值是不可能的。惟一的辦法是讓CPU進(jìn)入一會(huì)兒保護(hù)模式,在裝入了段寄存器之后馬上回到實(shí)模式。 進(jìn)入保護(hù)模式十分簡(jiǎn)單,只要建好GDT,把CR0寄存器的位0置上1,CPU就在保護(hù)模式了。從前面分析CPU地址形成機(jī)理可知,這時(shí)不必理會(huì)寄存器的“看得見(jiàn)部分”值是否合法,各種段寄存器是一樣可用的,就像沒(méi)進(jìn)保
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北省建筑安全員-A證考試題庫(kù)及答案
- 2025河南省建筑安全員A證考試題庫(kù)
- 《家禽常見(jiàn)病資料》課件
- 《法醫(yī)檢驗(yàn)相關(guān)》課件
- 單位人力資源管理制度集粹匯編十篇
- 單位人力資源管理制度呈現(xiàn)大合集十篇
- 北方華創(chuàng)刻蝕和薄膜沉積設(shè)備領(lǐng)域優(yōu)勢(shì)突出打造平臺(tái)型設(shè)備龍頭
- 2025年人形機(jī)器人行業(yè)投資策略報(bào)告:量產(chǎn)元年曙光將現(xiàn)
- 單位管理制度收錄大全人事管理十篇
- 單位管理制度收錄大合集員工管理篇十篇
- 2025年國(guó)家計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)急技術(shù)處理協(xié)調(diào)中心省級(jí)分中心招聘39人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之21:“7支持-7.5成文信息”(雷澤佳編制-2025B0)
- 2023-2024年電商直播行業(yè)現(xiàn)狀及發(fā)展趨勢(shì)研究報(bào)告
- 中央2024年市場(chǎng)監(jiān)管總局直屬事業(yè)單位招聘中層干部歷年參考題庫(kù)(頻考版)含答案解析
- 阜陽(yáng)市重點(diǎn)中學(xué)2025屆高考數(shù)學(xué)全真模擬密押卷含解析
- 2024年市特殊教育學(xué)校工作總結(jié)范文(2篇)
- LNG采購(gòu)框架合同范例
- 課題1 金屬材料 教學(xué)設(shè)計(jì) 九年級(jí)化學(xué)下冊(cè)人教版2024
- 能源崗位招聘筆試題與參考答案(某大型國(guó)企)
- 工業(yè)設(shè)計(jì)基礎(chǔ)知識(shí)單選題100道及答案解析
- 山西省晉中市2023-2024學(xué)年高一上學(xué)期期末考試 化學(xué) 含解析
評(píng)論
0/150
提交評(píng)論