青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

       作為軟件開發人員,大多數對于保護模式都感到神秘和不易理解。本人在開發32位微內核搶占式多線程操作系統過程中,深入了解到CPU的地址機理,在這里將分析CPU的工作原理,解開保護模式的神秘面紗,讀者將會發現保護模式其實與實模式一樣簡單和易于控制。在此基礎上用四五十行C語言程序做到進出保護模式和在實模式之下直接訪問整個4GB內存空間。
        雖然有許多書籍對保護模式作解釋,但沒有一本能簡單明了地解釋清楚,冗長煩雜的術語讓人看著想打瞌睡,甚至還有許多用匯編寫的(可能根本不能運行的)保護模式試驗程序,事實上用C語言本身就可以做保護模式的進出工作。
       我們可能知道CPU上電后從ROM中的BIOS開始運行,而Intel文檔卻說80x86CUP上電總是從最高內存下16字節開始執行,那么BIOS是處在內存的最頂端64K(FFFF0000H)還是1M之下的64K(F0000H)處呢?事實上在這兩個地方都同時出現(可用后面存取4GB內存的程序驗證)。
為什么?為了弄清楚以上問題,首先要了解CPU是如何處理物理地址的?真的是在實模式下用段寄存器左移4位與偏移量相加,在保護模式下用段描述符中的基地址加偏移量而兩者是毫無關聯的嗎?答案是兩者其實是一樣的。當Intel把80286推出時其地址空間變成了24位,從8086的20位到24位,十分自然地要加大段寄存器才行,實際上它們都被加大了,只是由于保護的原因加大的部分沒有被程序看見,到了80386之后地址又從24位加大到32位(80386SX是24位)。整個段寄存器如下圖所示:
@@12A08400.GIF;圖1@@
在8086中CPU只有“看得見部分”,從而也直接參與了地址形成運算,但在80286之后,在“看不見部分”中已經包含了地址值,“看得見部分”就退化為只是一個標號再也不用參與地址形成運算了。地址的形成總是從“不可看見部分”取出基址值與偏移相加形成地址。也就是說在實模式下當一個段寄存器被裝入一個值時,“看不見部分”的界限被設成FFFFH,基址部分才是要裝入值左移4位,屬性部分設成16位0特權級。這個過程與保護模式時裝入一個段存器是同理的,只是保護模式的“不可見部分”是從描述表中取值,而實模式是一套固定的過程。
對于CPU在形成地址時,是沒有實模式與保護模式之分的,它只管用基址(“不可見部分”)去加上偏移量。實模式與保護模式的差別實際上只是保護處理部件是否工作得更精確而已,比如不允許代碼段的寫入。實模式下的段寄存裝入有固定的形成辦法從而也就不需要保護模式的“描述符”了,因此保持了與8086/8088的兼容性。而“描述符”也只是為了裝入段寄存器的“不可見部分”而設的。
從上面的“整個段寄存器”可見CPU的地址形成與“看得見部分”的當前值毫無關系,這也解釋了為什么在剛進入保護模式時后面的代碼依然被正確地運行而這時代碼段寄存器CS的值卻還是進入保護模式前的實模式值,或者從保護模式回到實模式時代碼段CS被改變之前程序是正常地工作,而不會“突變”到CS左移4位的地址上去,比如在保護模式時CS是08H的選擇器,到了實模式時CS還是08H但地址不會突然變成80H加上偏段量中去。因為地址的形成不理會段寄存器“看得見部分”的當前值,這一個值只是在被裝入時對CPU有用。
地址的形成與CPU的工作模式無關,也就是說實模式與0特權級保護模式不分頁時是一模一樣的。明白了這一機理,在實模式下一樣可以處理通常被認為只有在保護模式才能做的事,比如訪問整個機器的內存。可以不必理會保護模式下的眾多術語,或者更易于理解,如選擇器就是“看得見部分”,描述符是為了裝入“不可見部分”而設的。
作為驗證CPU的這種機理,這里寫了一個實模式下訪問4GB內存的C程序。有一些書籍也介紹有同樣功能的匯編程序,但它們都錯誤地認為是利用80386芯片的設計疏漏。實際上Intel本身就在使用這種辦法,使得CPU上電時能從FFFFFFF0H處開始第一條指令,這種技術在286之后的每一臺機器每一次冷啟動時都使用,只是我們不知道罷了。CPU上電也整個代碼段寄存器是這樣的:
@@12A08401.GIF;圖2@@
EIP=0000FFF0H
這樣CS∶EIP形成了FFFFFFF0H的物理地址,當CPU進行一次遠跳轉重新裝入CS時,基址就變了。
為了訪問4G內存空間,必須有一個段寄存器的“不可見部分”的界限為4G-1,基址為0,這樣就包含了4GB內存,不必理會可見部分的值。顯然要讓段寄存器在實模式下直接裝入這些值是不可能的。唯一的辦法是讓CPU進入一會兒保護模式在裝入了段寄存器之后馬上回到實模式。
進入保護模式十分簡單,只要建好GDT把CRO寄存器的位0置上1,CPU就在保護模式了,從前面所分析CPU地址形成機理可知,這時不必理會寄存器的“看得見部分”值是否合法,各種段寄存器是一樣可用的,就像沒進保護模式一樣。在把一個包含有4GB地址空間的值裝入某個段寄存器之后就可返回實模式。
預先可建好GDT如下:
unsigned long GDT-Table[]={0,0, //空描述符,必須為零0x0000FFFF,0xCF9A00, //32位平面式代碼段0x0000FFFF,0xCF9200 } , //32位平面式數據段只是為了訪問數據的話只要2個GDT就足夠了,因為并沒有重裝代碼段,這里給出3個GDT只是為了完整性。
通常在進入保護模式時要關閉所有的中斷,把IDTR的界限設置為0,CPU自動關閉所有中斷,包括NMI,返回實模式后恢復IDTR并開中斷。
另外A20地址線的控制對于正確訪問整個內存也很重要,在進入保護模式前要讓8042打開A20地址線。
在這個例子里FS段寄存器設成可訪問4GB內存的基址和界限,由于在DOS中很少有程序會用到GS、FS這兩個386增加的段寄存器,當要讀寫4GB范圍中的任一個地方都可通過FS段來達到,直到FS在實模式下被重裝入沖掉為止。
這個例子在386SX、386DX、486上都運行通過。例子里加有十分詳細的注釋,由于這一程序是用BC 3.1編譯連接的,而其連接器不能為DOS程序處理32位寄存器,所以直接在代碼中加入操作碼前綴0x66和地址前綴0x67,以便讓DOS實模式下的16位程序可用32位寄存器和地址。程序的右邊以注釋形式給出等效的32位指令。要注意16位的指令中mov al, byte ptr [BX]的指令碼正好是32位的指令mov al, byte ptr[EDI]。
讀者可用這個程序驗證BIOS是否同時在兩個區域出現。如果有線性定址能力的VESA顯示卡(如TVGA9440)還可進一步驗證線性顯示緩沖區在1MB之上的工作情況。
#include <dos.h>
unsigned long GDT-Table[]=
{0,0, //NULL - 00H
0x0000FFFF,0x00CF9A00, //Code32 - 08h Base=0 Limit=4G-1 Size=4G
0x0000FFFF,0x00CF9200 //Data32 - 10h Base=0 Limit=4G-1 Size=4G
};
unsigned char OldIDT [6]={0}; //Save The IDTR before Enter Protect Mode.
unsigned char pdescr-tmp [6]={0}; //NULL The IDTR s Limit=0 CPU will
// disable all Interrupts, include NMI.
#define KeyWait() {while(inportb(0x64) &2);}
void A20Enable(void)
{
keyWait ();
outportb(0x64,0xD1);
KeyWait();
outportb(0x60,0xDF); //Enable A20 with 8042.
KeyWait();
outportb(0x64,0xFF);
KeyWait ();
}
void LoadFSLimit4G(void)
{
A20Enable (); //Enable A20
//***
Disable ints & Null IDT
//***
asm {
CLI //Disable inerrupts
SIDT OldIDT //Save OLD IDTR
LIDT pdescr-tmp //Set up empty IDT.Disable any interrupts,
} // Include NMI.
//***
Lodd GDTR
//***
asm{ // The right Code is Real, But BC++ s Linker NOT
// Work with 32bits Code.
db 0x66 //32 bit Operation Prefix in 16 Bit DOS.
MOV CX,DS //MOV ECX,DS
db 0x66 //Get Data segment physical Address
SHL CX,4 //SHL ECX,4
MOV word ptr pdescr-tmp [0],(3*8-1)
//MOV word ptr pdescr-tmp [0], (3*8-1)
db 0x66
XOR AX,AX //XOR EAX,EAX
MOV AX,offset GDT-Table
// MOV AX,offset GDT-Table
db 0x66
ADD AX,CX //ADD EAX,ECX
MOV word ptr pdescr-tmp [2], AX
//GDTR Base low16 bits
db 0x66
SHR AX,16 //SHR EAX,16
MOV word ptr pdescr-tmp [4],AX
//GDTR Base high16 bits
LGDT pdescr-tmp //Load GDTR
}
//****
//* Enter 32 bit Flat Protected Mode
//****
asm{
mov DX,0x10 // The Data32 Selector
db 0x66,0x0F,0x20,0xC0 // MOV EAX,CR0
db 0x66
MOV BX,AX // MOV EBX,EAX
OR AX,1
db 0x66,0x0F,0x22,0xC0
//MOV CRO,EAX // Set Protection enable bit
JMP Flsuh
} //Clear machine perform cache.
flush: // Now In Flat Mode, But The CS is Real Mode Value.
asm { //And it s attrib is 16Bit Code Segment.
db 0x66
MOV AX,BX //MOV EAX,EBX
db 0x8E,0xE2 //MOV FS,DX
//Load FS Base=0 Size=4G now
db 0x66,0x0F,0x22,0xC0 //MOV CRO,EAX
//Return Real Mode.
LIDT OldIDT //LIDT OldIDT //Restore IDTR
STI // STI //Enable INTR
}
}
unsigned char ReadByte (unsigned long Address)
{
asm db 0x66
asm mov di,word ptr Address // MOV EDI, Address
asm db 0x67 //32 bit Address Prefix
asm db 0x64 //FS:
asm mov al,byte ptr [BX] // =MOV AL, FS: [EDI]
return -AL;
}
unsigned char WriteByte(unsigned Long Address)
{
asm db 0x66
asm mov di,word ptr Address //MOV EDI, Address
asm db 0x67 //32 bit Address Prefix
asm db 0x64 //FS:
asm mov byte ptr [BX],al //=MOV FS: [EDI],AL
return -AL;
}
//////// Don t Touch Above Code ///
# include <stdio, h>
void Dump4G (unsigned long Address)
{
int i;
int j;
for (i=0; i<20; i++)
{
printf (“%081X: ”, (Address+i*16));
for (j=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 (" . ");
else printf (" %C ", ReadByte (Address+i*16+j));
}
printf (" ");
}
}
main ()
{
unsigned long Address=0;
unsigned long tmp;
LoadFSLimit4G ();
printf ("====Designed By Southern. 1995.7.17==== ");
printf (" Now you can Access The Machine All 4G Memory. ");
printf (" Input the Start Memory Physical to DUMP. ");
printf (" Press D to Cuntinue DUMP, 0 to End & Quit, ");
do {
printf ("-");
scanf ("%IX", &tmp);
if (tmp==0x0d) Address+=(20*16);
else Address=tmp;
Dump4G (Address);
}while (Address !=0);
return 0;
}

(作者地址:珠海巨人集團電腦排版公司
Posted on 2005-12-14 11:57 艾凡赫 閱讀(636) 評論(0)  編輯 收藏 引用 所屬分類: 基礎知識
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区二区观看| 欧美精彩视频一区二区三区| 久久亚洲一区二区| 欧美一区二区三区男人的天堂| 亚洲尤物在线| 欧美亚洲在线观看| 久久女同精品一区二区| 老司机aⅴ在线精品导航| 老司机免费视频一区二区| 欧美福利视频| 99香蕉国产精品偷在线观看| 亚洲欧美综合v| 蜜桃久久av一区| 欧美性做爰猛烈叫床潮| 国产一区二区三区最好精华液| 亚洲国产天堂久久国产91| 亚洲天堂久久| 久久久久久久欧美精品| 最新成人av网站| 亚洲一级黄色| 久久综合九色99| 国产精品久久久久免费a∨大胸| 国产视频亚洲精品| 亚洲精品综合在线| 亚洲免费视频中文字幕| 久久久精品2019中文字幕神马| 米奇777在线欧美播放| 亚洲毛片一区| 久久九九热免费视频| 欧美精品久久久久久久| 国产日韩综合| 亚洲一区二区黄| 欧美国产精品久久| 欧美一区二区啪啪| 欧美视频国产精品| 亚洲日本精品国产第一区| 久久9热精品视频| 亚洲激情电影在线| 久久久久免费视频| 国产裸体写真av一区二区| 亚洲日本成人在线观看| 久久综合久久久久88| 一区二区三区|亚洲午夜| 美国成人直播| 禁久久精品乱码| 久久精品理论片| 亚洲午夜精品在线| 国产精品草莓在线免费观看| 夜夜嗨av一区二区三区四季av| 欧美激情一二区| 免费在线观看一区二区| 亚洲第一视频| 欧美 日韩 国产 一区| 欧美一级免费视频| 国产老女人精品毛片久久| 亚洲一区精品在线| 亚洲视频在线观看视频| 国产精品国产三级国产| 亚洲午夜久久久| 在线视频一区二区| 国产精品swag| 亚洲欧美在线磁力| 亚洲欧美日韩精品久久亚洲区 | 国外成人在线视频| 久久国产视频网| 久久激情视频免费观看| 国产中文一区二区三区| 久久中文久久字幕| 免费观看国产成人| 日韩亚洲欧美在线观看| 亚洲精品日韩激情在线电影| 欧美日韩精品免费看| 亚洲男人的天堂在线aⅴ视频| 亚洲永久在线观看| 红杏aⅴ成人免费视频| 欧美国产激情| 欧美午夜大胆人体| 亚洲免费视频在线观看| 亚洲国产日韩欧美在线99| 在线亚洲+欧美+日本专区| 亚洲免费成人av| 欧美亚洲动漫精品| 欧美一区二区三区日韩视频| 欧美在线|欧美| 亚洲第一网站免费视频| 亚洲黄色免费电影| 欧美午夜一区二区三区免费大片 | 欧美在线一级va免费观看| 午夜在线不卡| 亚洲经典三级| 亚洲一区久久| 亚洲国产99| 一区二区国产精品| 在线免费观看日本一区| 一本大道久久a久久精品综合 | 国内久久视频| 亚洲高清三级视频| 国产精品毛片大码女人| 美女国内精品自产拍在线播放| 欧美国产在线观看| 久久精品国产v日韩v亚洲| 欧美激情乱人伦| 久久久久久久久久久久久久一区 | 亚洲日本成人| 国内综合精品午夜久久资源| 亚洲美女一区| 亚洲国产第一| 午夜一区二区三视频在线观看| 日韩视频永久免费观看| 久久精品国产91精品亚洲| 亚洲夜晚福利在线观看| 欧美a一区二区| 久久人人爽人人爽爽久久| 国产精品地址| 亚洲免费黄色| 亚洲日韩视频| 久久av在线| 性久久久久久久| 欧美日韩一区二区精品| 欧美成人蜜桃| 极品日韩久久| 欧美怡红院视频| 欧美在线一二三四区| 国产精品区免费视频| avtt综合网| 亚洲无亚洲人成网站77777| 欧美大片在线观看一区二区| 麻豆freexxxx性91精品| 激情成人av| 久久亚洲不卡| 欧美电影免费观看高清| 亚洲国产日韩在线一区模特| 狼人社综合社区| 欧美国产成人在线| 亚洲精品裸体| 欧美日韩日本网| 亚洲精品国产精品乱码不99按摩| 久久国产精品72免费观看| 欧美午夜a级限制福利片| 最新国产拍偷乱拍精品 | 国产亚洲欧美色| 亚洲性人人天天夜夜摸| 亚洲一区中文字幕在线观看| 欧美性生交xxxxx久久久| 在线亚洲激情| 欧美一区二区视频在线观看2020 | 国产一区二区日韩| 欧美怡红院视频一区二区三区| 久久久久天天天天| 一区二区在线观看av| 美女精品网站| 亚洲欧洲在线一区| 亚洲一区区二区| 国产精品揄拍500视频| 午夜精品一区二区三区电影天堂| 久久精品在线免费观看| 在线免费观看视频一区| 欧美顶级大胆免费视频| 日韩午夜在线| 久久综合中文字幕| 欧美日韩精品高清| 亚洲精品美女久久久久| 欧美成人激情在线| av不卡在线| 老司机精品视频一区二区三区| 亚洲二区精品| 国产精品毛片va一区二区三区 | 久久久7777| 亚洲国产一区二区在线| 欧美日韩精品一区二区三区四区| 亚洲综合999| 亚洲黄色天堂| 久久激情五月激情| 亚洲乱码日产精品bd| 国产欧美日韩精品在线| 麻豆久久精品| 日韩视频免费看| 国产精品久久久久影院亚瑟| 国产欧美亚洲日本| 国产精品久久久久久久久久久久| 亚洲综合日韩在线| 亚洲福利小视频| 亚洲欧美激情在线视频| 在线日韩日本国产亚洲| 国产精品一国产精品k频道56| 免费在线观看日韩欧美| 亚洲尤物视频网| 最新中文字幕一区二区三区| 欧美专区在线观看一区| 夜夜爽www精品| 在线观看av不卡| 国产精品日韩在线| 欧美日韩国产综合视频在线观看 | 久久精品国产77777蜜臀| 99在线精品视频在线观看| 亚洲高清网站| 国产精品wwwwww| 日韩视频一区二区| 极品尤物av久久免费看| 国产乱人伦精品一区二区|