Windows的保護模式 (轉)

worldblog發表於2007-12-07
Windows的保護模式 (轉)[@more@]的保護
  
  孫喜明

一般來說,80x86(80386及其以後的各代)可以在三種模式下運轉:真實模式,保護模式,V86模式。真實模式就是古老的MS-DOS的執行環境。Win95只利用了兩種模式:保護模式和V86模式。

為什麼要進入保護模式

保護模式有許多優越性。其中最最直接的好處就是:你的可以利用更多的了!

不要以為這是什麼大不了的問題,我相信每一個曾在MS-DOS下寫程式的人都有一個苦惱:怎樣在程式中開個足夠大的陣列?動不動就會堆疊,許多事都不能做了。不要怨Turbo C、MS Fortran、Turbo Pascal,它們也是心有餘而力不足。這些煩惱都源自“你的程式是執行在真實模式下的”。執行在真實模式下的16位程式最多隻能存取1M的記憶體。你也許會問:我的機器上不是有64M記憶體嗎?是啊,如果說你是在MS-DOS下執行程式(或者說CPU運轉在真實模式下),那你只利用了1M記憶體,其餘的記憶體都“下崗”了,在這種情況下,你的386/486/586/PⅡ只相當於一個跑得快的8086。

但是保護模式給了我們一個驚喜。理論上,在保護模式下,CPU可以定址4096M(即4GB)記憶體。這就是說,只需把你的程式編譯成32位的可程式(當然得藉助32位),你就可以在程式中充分利用記憶體了,這樣做的直接結果是:你可以不用再為堆疊溢位或開不出5000×5000的陣列而吃不下飯了。

正是4GB記憶體存取的實現,使得操作有了更加智慧化的物質基礎,多工的實現才可以提到日程上來考慮了。

再深入一些

從結構上說,386由三個暫存器CR0、CR1、CR2控制著CPU的運轉。比如說,CR0的第0位就是用來判斷當前CPU是工作在保護模式還是真實模式下。學過8088/8086語言的人一定熟悉AX、BX、CX、DX、SI、DI、SP、BP這些16位的暫存器,在80386中,這些暫存器被擴充套件到了32位,即EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP,如果CPU是運轉在真實模式下,那你只能利用這些32位暫存器的前16位,而後面的16位就浪費了。

段的概念是我們理解保護模式的關鍵所在。在真實模式下,段暫存器中存放著16位的段地址,這時,段地址是參與定址的:把段地址左移4位,加上偏移地址,就是20位的實體地址了。在保護模式下,段暫存器中存放著16位的段選擇器(Segment or),這個值是不直接參與定址的,而只是一個指向段描述表(Segment Descriptor Table)的。段描述表(Segment Descriptor Table)中存放著段描述符(Segment Descriptor)。段描述符中有關於段的描述,比如:段在記憶體中的位置、段的大小、段的型別(是資料段還是程式碼段)等等。

當CPU執行在保護模式下時,記憶體中往往有至少三張段描述表:全域性描述表(Global Descriptor Table,簡稱GDT)、區域性描述表(Local Descriptor,簡稱LDT)、中斷描述表(Interrupt Descriptor Table,簡稱IDT)。說到這裡,我想提醒讀者注意:記住GDT、LDT、IDT這三個詞的含義,我們在後面會經常用到。

段描述表不可能超過64K(為什麼?如果回答不上來,那就再看看前面的講解),每個段描述符(也就是段描述表中的一項)都是8byte長,所以說,每個段描述表最多隻能包含8192個段描述符。

在今後的“走進VxD世界”中,我們將對段描述表、段描述符以及分頁機制作進一步的講解。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989367/,如需轉載,請註明出處,否則將追究法律責任。

相關文章