久久99热66热这里只有精品,特黄特色的大片在线观看,亚洲日本三级在线观看,国产三级农村妇女在线,亚洲av毛片免费在线观看,哺乳叫自慰在线看,天天干美女av网

在DOS實(shí)模式下直接存取4GB內(nèi)存

時(shí)間:2023-05-01 07:39:31 計(jì)算機(jī)論文 我要投稿
  • 相關(guān)推薦

在DOS實(shí)模式下直接存取4GB內(nèi)存

作為軟件開發(fā)人員,大多數(shù)對(duì)于保護(hù)模式都感到神秘和不易理解。本人在開發(fā)32位微內(nèi)核搶占式多線程操作系統(tǒng)過程中,深入了解到CPU的地址機(jī)理,在這里將分析CPU的工作原理,解開保護(hù)模式的神秘面紗,讀者將會(huì)發(fā)現(xiàn)保護(hù)模式其實(shí)與實(shí)模式一樣簡(jiǎn)單和易于控制。在此基礎(chǔ)上用四五十行C語(yǔ)言程序做到進(jìn)出保護(hù)模式和在實(shí)模式之下直接訪問整個(gè)4GB內(nèi)存空間。

雖然有許多書籍對(duì)保護(hù)模式作解釋,但沒有一本能簡(jiǎn)單明了地解釋清楚,冗長(zhǎng)煩雜的術(shù)語(yǔ)讓人看著想打瞌睡,甚至還有許多用匯編寫的(可能根本不能運(yùn)行的)保護(hù)模式試驗(yàn)程序,事實(shí)上用C語(yǔ)言本身就可以做保護(hù)模式的進(jìn)出工作。

我們可能知道CPU上電后從ROM中的BIOS開始運(yùn)行,而Intel文檔卻說80x86CUP上電總是從最高內(nèi)存下16字節(jié)開始執(zhí)行,那么BIOS是處在內(nèi)存的最頂端64K(FFFF0000H)還是1M之下的64K(F0000H)處呢?事實(shí)上在這兩個(gè)地方都同時(shí)出現(xiàn)(可用后面存取4GB內(nèi)存的程序驗(yàn)證)。

為什么?為了弄清楚以上問題,首先要了解CPU是如何處理物理地址的?真的是在實(shí)模式下用段寄存器左移4位與偏移量相加,在保護(hù)模式下用段描述符中的基地址加偏移量而兩者是毫無關(guān)聯(lián)的嗎?答案是兩者其實(shí)是一樣的。當(dāng)Intel把80286推出時(shí)其地址空間變成了24位,從8086的20位到24位,十分自然地要加大段寄存器才行,實(shí)際上它們都被加大了,只是由于保護(hù)的原因加大的部分沒有被程序看見,到了80386之后地址又從24位加大到32位(80386SX是24位)。整個(gè)段寄存器如下圖所示:

@@12A08400.GIF;圖1@@

在8086中CPU只有“看得見部分”,從而也直接參與了地址形成運(yùn)算,但在80286之后,在“看不見部分”中已經(jīng)包含了地址值,“看得見部分”就退化為只是一個(gè)標(biāo)號(hào)再也不用參與地址形成運(yùn)算了。地址的形成總是從“不可看見部分”取出基址值與偏移相加形成地址。也就是說在實(shí)模式下當(dāng)一個(gè)段寄存器被裝入一個(gè)值時(shí),“看不見部分”的界限被設(shè)成FFFFH,基址部分才是要裝入值左移4位,屬性部分設(shè)成16位0特權(quán)級(jí)。這個(gè)過程與保護(hù)模式時(shí)裝入一個(gè)段存器是同理的,只是保護(hù)模式的“不可見部分”是從描述表中取值,而實(shí)模式是一套固定的過程。

對(duì)于CPU在形成地址時(shí),是沒有實(shí)模式與保護(hù)模式之分的,它只管用基址(“不可見部分”)去加上偏移量。實(shí)模式與保護(hù)模式的差別實(shí)際上只是保護(hù)處理部件是否工作得更精確而已,比如不允許代碼段的寫入。實(shí)模式下的段寄存裝入有固定的形成辦法從而也就不需要保護(hù)模式的“描述符”了,因此保持了與8086/8088的兼容性。而“描述符”也只是為了裝入段寄存器的“不可見部分”而設(shè)的。

從上面的“整個(gè)段寄存器”可見CPU的地址形成與“看得見部分”的當(dāng)前值毫無關(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ì)段寄存器“看得見部分”的當(dāng)前值,這一個(gè)值只是在被裝入時(shí)對(duì)CPU有用。

地址的形成與CPU的工作模式無關(guān),也就是說實(shí)模式與0特權(quán)級(jí)保護(hù)模式不分頁(yè)時(shí)是一模一樣的。明白了這一機(jī)理,在實(shí)模式下一樣可以處理通常被認(rèn)為只有在保護(hù)模式才能做的事,比如訪問整個(gè)機(jī)器的內(nèi)存。可以不必理會(huì)保護(hù)模式下的眾多術(shù)語(yǔ),或者更易于理解,如選擇器就是“看得見部分”,描述符是為了裝入“不可見部分”而設(shè)的。

作為驗(yàn)證CPU的這種機(jī)理,這里寫了一個(gè)實(shí)模式下訪問4GB內(nèi)存的C程序。有一些書籍也介紹有同樣功能的匯編程序,但它們都錯(cuò)誤地認(rèn)為是利用80386芯片的設(shè)計(jì)疏漏。實(shí)際上Intel本身就在使用這種辦法,使得CPU上電時(shí)能從FFFFFFF0H處開始第一條指令,這種技術(shù)在286之后的每一臺(tái)機(jī)器每一次冷啟動(dòng)時(shí)都使用,只是我們不知道罷了。CPU上電也整個(gè)代碼段寄存器是這樣的:

@@12A08401.GIF;圖2@@

EIP=0000FFF0H

這樣CS∶EIP形成了FFFFFFF0H的物理地址,當(dāng)CPU進(jìn)行一次遠(yuǎn)跳轉(zhuǎn)重新裝入CS時(shí),基址就變了。

為了訪問4G內(nèi)存空間,必須有

[1] [2] [3] [4] 

【在DOS實(shí)模式下直接存取4GB內(nèi)存】相關(guān)文章:

DOS命令04-29

網(wǎng)絡(luò)模式下的編輯流程04-26

內(nèi)存·什么是內(nèi)存電壓04-26

數(shù)控實(shí)訓(xùn)教學(xué)模式探討04-29

互動(dòng)教學(xué)模式下的詞匯教學(xué)05-02

新課標(biāo)背景下的教學(xué)模式構(gòu)建04-28

網(wǎng)絡(luò)環(huán)境下教學(xué)模式探索05-01

企業(yè)訂單模式下駕駛臺(tái)資源管理實(shí)訓(xùn)過程設(shè)計(jì)04-28

DOS的特點(diǎn)電腦資料11-01

故障模式下的空間交會(huì)防撞設(shè)計(jì)04-27