從實模式到保護模式第8到12章筆記_第1頁
從實模式到保護模式第8到12章筆記_第2頁
從實模式到保護模式第8到12章筆記_第3頁
從實模式到保護模式第8到12章筆記_第4頁
從實模式到保護模式第8到12章筆記_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第10章 IA3210.1 IA-32架構(gòu)的基本執(zhí)行環(huán)境 10.1.1 寄存器的擴展 在16位處理器內(nèi),有8個通用寄存器AX、BX、CX、DX、SI、DI、BP和SP,其中,前4個還可以拆分成兩個獨立的8位寄存器來用,即AH、AL、BH、BL、CH、CL、DH和DL。為了在匯編語言程序中使用經(jīng)過擴展(Extend)的寄存器,需要給它們命名,它們的名字分別是EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP??梢栽诔绦蛑惺褂眠@些寄存器,即使是在實模式下: mov eax,0xf0000005 mov ecx,eax add edx,ecx 但是,就像以上指令所示的那樣,指令的源操作數(shù)

2、和目的操作數(shù)必須具有相同的長度,個別特殊用途的指令除外。因此,像這樣的搭配是不允許的,在程序編譯時,編譯器會報告錯誤: mov eax,cx ;錯誤的匯編語言指令 如果目的操作數(shù)是32位寄存器,源操作數(shù)是立即數(shù),那么,立即數(shù)被視為32位的: mov eax,0xf5 ;EAX0x000000f5 32位通用寄存器的高16位是不可獨立使用的,但低16位保持同16位處理器的兼容性。因此,在任何時候它們都可以照往常一樣使用: mov ah,0x02 mov al,0x03 add ax,si 可以在32位處理器上運行16位處理器上的軟件。但是,它并不是16位處理器的簡單增強。事實上,32位處理器有自

3、己的32位工作模式,在本書中,32位模式特指32位保護模式。在這種模式下,可以完全、充分地發(fā)揮處理器的性能。同時,在這種模式下,處理器可以使用它全部的32根地址線,能夠訪問4GB內(nèi)存。10.1.2 基本的工作模式 8086具有16位的段寄存器、指令指針寄存器和通用寄存器(CS、SS、DS、ES、IP、AX、BX、CX、DX、SI、DI、BP、SP),因此,我們稱它為16位的處理器。盡管它可以訪問1MB的內(nèi)存,但是只能分段進行,而且由于只能使用16位的段內(nèi)偏移量,故段的長度最大只能是64KB。8086只有一種工作模式,即實模式。當(dāng)然,這個名稱是后來才提出來的。 10.1.3 線性地址 為IA-3

4、2處理器編程,訪問內(nèi)存時,需要在程序中給出段地址和偏移量,因為分段是IA-32架構(gòu)的基本特征之一。傳統(tǒng)上,段地址和偏移地址稱為邏輯地址,偏移地址叫做有效地址(Effective Address,EA),在指令中給出有效地址的方式叫做尋址方式(Addressing Mode)。10.2 現(xiàn)代處理器的結(jié)構(gòu)和特點 10.2.1 流水線 處理器的每一次更新?lián)Q代,都會增加若干新特性,這是很自然的。同時我們也會發(fā)現(xiàn),老軟件在新的處理器上跑得更快。這里面的原因很簡單,處理器的設(shè)計者總是在想盡辦法加快指令的執(zhí)行。 10.2.2 高速緩存 影響處理器速度的另一個因素是存儲器。從處理器內(nèi)部向外看,它們分別是寄存器

5、、內(nèi)存和硬盤。當(dāng)然,現(xiàn)在有的計算機已經(jīng)用上了固態(tài)磁盤。 10.2.3 亂序執(zhí)行 為了實現(xiàn)流水線技術(shù),需要將指令拆分成更小的可獨立執(zhí)行部分,即拆分成微操作(Micro-Operations),簡寫為ops。 10.2.5 分支目標(biāo)預(yù)測 流水線并不是百分之百完美的解決方案。實際上,有很多潛在的因素會使得流水線不能達到最佳的效率。一個典型的情況是,如果遇到一條轉(zhuǎn)移指令,則后面那些已經(jīng)進入流水線的指令就都無效了。換句話說,我們必須清空(Flush)流水線,從要轉(zhuǎn)移到的目標(biāo)位置處重新取指令放入流水線。 10.3.1 32位處理器的尋址方式 在16位處理器上,指令中的操作數(shù)可以是8位或者16位的寄存器、指

6、向8位或者16位實際操作數(shù)的16位內(nèi)存地址,以及8位或16位的立即數(shù)。 第十一章 進入保護模式NASM編譯l 情景描述使用NASM編譯一段程序,并可以在裸機上運行。l 實現(xiàn)功能在開機后顯示"Hello, OS world!"l 流程1) 初始化寄存器2) 調(diào)用BIOS int 10h,顯示字符串3) 進入死循環(huán)l 代碼及注釋%define_BOOT_DEBUG_%ifdef_BOOT_DEBUG_org 0100h%elseorg 07c00h%endif;告訴編譯器加載到0100處生成,這樣方便生成com文件。;或者告訴編譯器加載到7c00處生成,這樣方便mov ax,c

7、s;將當(dāng)前段地址放入ax,可以不要mov ds,ax;將當(dāng)前段地址放入數(shù)據(jù)寄存器,可以不要mov es,ax;將當(dāng)前段地址放入extra寄存器,可以不要call DispStr;調(diào)用顯示字符串程序jmp $;無限循環(huán)(跳轉(zhuǎn)到當(dāng)前地址)DispStr:mov ax,BootMessage;BootMessage的首地址送axmov bp,ax; 段內(nèi)地址送到bp,至此地址完成 CS:BP = 串地址mov cx,16; CX = 串長度mov ax,01301h; AH = 13,AL = 01hmov bx,000ch; BH = 0(頁號為0),BL = 0ch(黑底紅字高亮)mov dl,

8、0; 0送dx寄存器的低字節(jié)int 10h; 10h號中斷(視頻中斷,對應(yīng)的中斷向量為40-43H)ret; 從顯示子程序中返回到主程序BootMessage: db "Hello, OS world!"times 510-($-$) db 0; 用“0”填充0面0磁道1扇區(qū)剩下的空間,使生成的二進制代碼恰好為512字節(jié);;$是當(dāng)前行的段內(nèi)偏移地址,$是本小節(jié)代碼的第一行代碼,在本程序中就是“org07c00h”的段內(nèi)偏移地址。dw 0xaa55;結(jié)束標(biāo)志. 使得0面0磁道1扇區(qū)510字節(jié)存55,511字節(jié)存aa,0扇區(qū)從0-511號單元,共512個字節(jié)。(引導(dǎo)扇區(qū)的結(jié)束標(biāo)

9、志)l 顯示界面運行程序界面實驗補充資料一. 內(nèi)存引導(dǎo)地址7C00Intel公司當(dāng)初設(shè)計8086系統(tǒng)內(nèi)存時對內(nèi)存(1M)是這樣規(guī)定的:內(nèi)存包括暫駐程序區(qū)640K和系統(tǒng)內(nèi)存區(qū)384K,在640K中把BIOS和駐留操作系統(tǒng)的數(shù)據(jù)和程序安排在低地址處,在保留一定的可擴展空間后,為配合BIOS和磁盤操作系統(tǒng)就把7C00規(guī)定為硬件及軟件都支持的啟動引導(dǎo)的內(nèi)存地址,并寫成引導(dǎo)規(guī)范。在當(dāng)時各個公司都有自己的一些未公開的標(biāo)準(zhǔn),而IBM公開推行IBM計算機的內(nèi)部詳細的結(jié)構(gòu)時,他采用的是Intel的芯片,所以他遵循了這個標(biāo)準(zhǔn),又由于大批的公司知道了這個標(biāo)準(zhǔn)之后,都兼容這個標(biāo)準(zhǔn),以后也繼續(xù)兼容,就真正成為一個共同的

10、標(biāo)準(zhǔn)了,現(xiàn)在的CPU都是向下兼容的,還在用7C00。由于引導(dǎo)扇區(qū)被加載到了7c00h處,代碼中BootMessage的首地址放入bp中時,只是將8位放入了bp,缺省了高8位,這高8位需要由org指定,否則無法將正確的字符串相對偏移地址放入bp中:BootMessage變量對應(yīng)字符串在內(nèi)存中首地址=0000(es段值):7c00(org指定)+BootMessage在程序段內(nèi)偏移(8位2進制)org會在編譯期影響到內(nèi)存尋址指令的編譯(編譯器會把所有程序用到的段內(nèi)偏移地址自動加上org 后跟的數(shù)值),而其自身并不會被編譯成機器碼。就是為程序中所有的引用地址(需要計算的相對地址)增加一個段內(nèi)偏移值。

11、二. 10h中斷說明10h中斷表示,功能號為AH=13h時為寫入字符串;AL=01h表示字符串包含屬性;BH=頁數(shù);BL=顯示屬性;CX=字符串中的字符數(shù)量;DL,DH=從哪一列,行開始寫;ES:BP指向該字符串 反編譯通過反編譯,可以將程序返回至源代碼內(nèi)容反編譯方法:ndisasmw -o 0x7c00 >> 1.asm顯示1.asm內(nèi)容如下:00007C00 8CC8 mov ax,cs00007C02 8ED8 mov ds,ax00007C04 8EC0 mov es,ax00007C06 E80200 call 0x7c0b00007C09 EBFE jmp short

12、0x7c0900007C0B B81E01 mov ax,0x11e00007C0E 89C5 mov bp,ax00007C10 B91000 mov cx,0x1000007C13 B80113 mov ax,0x130100007C16 BB0C00 mov bx,0xc00007C19 B200 mov dl,0x000007C1B CD10 int 0x1000007C1D C3 ret以下為數(shù)據(jù)區(qū)00007C1E 48 H00007C1F 65 e00007C206Cl00007C21 6Cl00007C22 6Fo00007C23 2C ,00007C2420空格00007C25

13、 4FO00007C26 53S00007C27 20空格00007C2877w00007C296F000007C2A 72r00007C2B6Cl00007C2C 64d00007C2D 21!以下數(shù)據(jù)為000007C2E 00無00007DFC 00 無00007DFD 00無00007DFE55AA 55AA 保護模式 保護模式介紹保護模式(Protected Mode,或有時簡寫為pmode) 是一種80286系列和之后的x86兼容CPU操作模式。保護模式有一些新的特色,設(shè)計用來增強多工和系統(tǒng)穩(wěn)定度,像是內(nèi)存保護,分頁系統(tǒng),以及硬件支援的虛擬內(nèi)存。大部分的現(xiàn)今x86操作系統(tǒng)都在保護模式

14、下運行,包含Linux、FreeBSD、以及微軟Windows 2.0 和之后版本。PM是處理器的native模式,在這種模式下,處理器支持所有的指令和所有的體系結(jié)構(gòu)特性提供最高的性能和兼容性。對于所有的應(yīng)用程序和操作系統(tǒng)來說,建議都使用這種模式。另外一種286和其之后CPU的操作模式是真實模式(Real Mode),一種向前兼容且關(guān)閉這些特色的模式。設(shè)計用來讓新的芯片可以執(zhí)行舊的軟件。依照設(shè)計的規(guī)格,所有的x86 CPU都是在真實模式下開機來確保傳統(tǒng)操作系統(tǒng)的向前兼容性。在任何保護模式的特色可用前,他們必須要由某些程序手動地切換到保護模式。在現(xiàn)今的電腦,這種切換通常是由操作系統(tǒng)在開機時候必須

15、完成的第一件工作的其中內(nèi)容之一。為了保證PM的兼容性,處理器允許在受保護的,多任務(wù)的環(huán)境下執(zhí)行RM程序。這個特性被稱做虛擬8086模式(Virtual -8086 Mode),盡管它并不是一個真正的處理器模式。Virtual-8086模式實際上是一個PM的屬性,任何任務(wù)都可以使用它。它也可能當(dāng)CPU在保護模式下運行時,使用虛擬86模式來執(zhí)行設(shè)計給真實模式的程序碼。RM提供了Intel 8086處理器的編程環(huán)境,另外有一些擴展(比如切換到PM或SMM的能力)。當(dāng)主機被Power-up或Reset后,處理器處于RM下。對于Intel 80386以及其后的芯片,只有使用PM才能發(fā)揮作用。因此需要解決

16、從RM切換到PM的問題。 GDT(Global Descriptor Table)在保護模式下,一個重要的數(shù)據(jù)結(jié)構(gòu)就是GDT。在實模式下,我們對一個內(nèi)存地址的訪問是通過(Segment:Offset)的方式來進行的。其中Segment是一個段的基地址,而一個段的最大長度是64 KB(216),這是16位系統(tǒng)所能表示的最大長度。而Offset則是相對于該段基地址的偏移量。因此Base Address+Offset就是一個內(nèi)存絕對地址。由此,我們可以看出,一個段具備兩個因素:Base Address和Limit(段的最大長度),而對一個內(nèi)存地址的訪問,則是需要指出:使用哪個段?以及相對于這個段Ba

17、se Address的Offset(這個Offset應(yīng)該小于此段的Limit)。當(dāng)然對于16-bit系統(tǒng),Limit不要指定,默認(rèn)為最大長度64KB,而 16-bit的Offset也永遠不可能大于此Limit。我們在實際編程的時候,使用16-bit段寄存器CS(Code Segment),DS(Data Segment),SS(Stack Segment)來指定Segment,CPU將段寄存器中的數(shù)值向左偏移4-bit,放到20-bit的地址線上就成為20-bit的Base Address。(因此內(nèi)存為220,不會超過1M)到了保護模式,內(nèi)存的管理模式分為兩種,段模式和頁模式,其中頁模式也是基

18、于段模式的。也就是說,保護模式的內(nèi)存管理模式事實上是:純段模式和段頁式。進一步說,段模式必不可少。對于段模式來講,訪問一個內(nèi)存地址仍然使用Segment:Offset的方式,其中由于保護模式運行在32位系統(tǒng)上,那么Segment的兩個因素:Base Address和Limit也都應(yīng)該是32位的。IA-32允許將一個段的Base Address設(shè)為32-bit所能表示的任何值(Limit則可以被設(shè)為32-bit所能表示的,以212為倍數(shù)的任何數(shù)字。而不象Real Mode下,一個段的Base Address只能是16的倍數(shù)(因為其低4-bit是通過左移運算得來的,只能為0,從而達到使用16-bi

19、t段寄存器表示20-bit Base Address的目的),而一個段的Limit只能為固定值64 KB。)另外,Protected Mode又為段模式提供了保護機制,也就說一個段的描述符需要規(guī)定對自身的訪問權(quán)限(Access)。所以在Protected Mode下,對一個段的描述則包括3方面因素:Base Address, Limit, Access,它們加在一起被放在一個64-bit長的數(shù)據(jù)結(jié)構(gòu)中,被稱為段描述符。這樣如果直接通過一個64-bit段描述符來引用一個段的時候,就必須使用一個64-bit長的段寄存器裝入這個段描述符。但Intel為了保持向后兼容,將段寄存器仍然規(guī)定為16-bit

20、(盡管每個段寄存器事實上有一個64-bit長的不可見部分,但對于程序員來說,段寄存器就是16-bit的),那么很明顯,無法通過16-bit長度的段寄存器來直接引用64-bit的段描述符。解決的方法就是把這些長度為64-bit的段描述符放入一個數(shù)組中,而將段寄存器中的值作為下標(biāo)索引來間接引用(事實上,是將段寄存器中的高13 -bit的內(nèi)容作為索引)。這個全局的數(shù)組就是GDT。在GDT中存放的不僅僅是段描述符,還有其它描述符,它們都是64-bit。GDT可以被放在內(nèi)存的任何位置,那么當(dāng)程序員通過段寄存器來引用一個段描述符時,CPU必須知道GDT的入口,也就是GDT的基地址放在哪里,因此設(shè)計者提供了

21、一個寄存器GDTR用來存放GDT的入口地址,程序員將GDT設(shè)定在內(nèi)存中某個位置之后,可以通過lgdt指令將GDT的入口地址裝入此寄存器,之后從此以后,CPU就根據(jù)此寄存器的內(nèi)容作為GDT的入口來訪問GDT了。GDT是Protected Mode所必須的數(shù)據(jù)結(jié)構(gòu),也是唯一的。它是全局可見的,對任何一個任務(wù)而言都是這樣。除了GDT之外,IA-32還允許程序員構(gòu)建與GDT類似的數(shù)據(jù)結(jié)構(gòu),它們被稱作LDT(Local Descriptor Table)。但與GDT不同的是,LDT在系統(tǒng)中可以存在多個,并且不是全局可見的,它們只對引用它們的任務(wù)可見。每個任務(wù)最多可以擁有一個LDT。另外,每一個LDT自身

22、作為一個段存在,它們的段描述符被放在GDT中。前面所討論的裝入段寄存器中作為GDT/LDT索引的就是Segment Selector(選擇子),當(dāng)需要引用一個內(nèi)存地址時,使用的仍然是Segment:Offset模式,具體操作是:在相應(yīng)的段寄存器裝入Segment Selector,按照這個Segment Selector可以到GDT或LDT中找到相應(yīng)的Segment Descriptor,這個Segment Descriptor中記錄了此段的Base Address,然后加上Offset,就得到了最后的內(nèi)存地址。 從實模式到保護模式l 情景描述完成一個程序,從實模式到保護模式的轉(zhuǎn)變l 編譯方法

23、nasm pmtest1.asm -o l pmtest1.asm程序源碼%include "pm.inc" 常量, 宏, 以及一些說明org 0100h; 告訴編譯器程序加載到0100處(段值) jmp LABEL_BEGIN; 跳到LABEL_BEGIN處SECTION .gdt; GDTLABEL_GDT: Descriptor 0, 0, 0 ; 空描述符(全部為零)LABEL_DESC_CODE32: Descriptor 0, SegCode32Len-1, DA_C+DA_32 ; 非一致代碼段, 32(定義界限和屬性); LABEL_DESC_CODE32

24、98H (10011000B) 內(nèi)存中,DPL為0,代碼段,只執(zhí)行; LABEL_DESC_CODE32 4000H (0100B) 32位LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 顯存首地址(定義基址,界限和屬性); LABEL_DESC_VIDEO 92h 存在的可讀寫數(shù)據(jù)段屬性值,指向顯存; GDT 結(jié)束GdtLen equ $-LABEL_GDT ; GDT長度GdtPtr dw GdtLen-1 ; GDT界限 dd 0 ; GDT基地址; GDT 選擇子SelectorCode32equ LABEL_DESC_CO

25、DE32-LABEL_GDTSelectorVideo equ LABEL_DESC_VIDEO-LABEL_GDT; GDT 選擇子 結(jié)束; END of SECTION .gdtSECTION .s16BITS 16LABEL_BEGIN: mov ax, cs ; 段值-AX mov ds, ax ; DS指向與CS相同的段值 mov es, ax ; ES指向與CS相同的段值 mov ss, ax ; SS指向與CS相同的段值 mov sp, 0100h ; 初始化 32 位代碼段描述符 xor eax, eax ; 清空EAX mov ax, cs ; 段值 shl eax, 4 ;

26、 段值左移4位 add eax, LABEL_SEG_CODE32 ; 段值+偏移地址-基址 mov word LABEL_DESC_CODE32 + 2, ax ; 基址1 shr eax, 16 mov byte LABEL_DESC_CODE32 + 4, al; 基址2 mov byte LABEL_DESC_CODE32 + 7, ah ; 基址3 ; 為加載 GDTR 作準(zhǔn)備 xor eax, eax ; 清空EAX mov ax, ds shl eax, 4 add eax, LABEL_GDT ; eax <- gdt 基地址 mov dword GdtPtr + 2,

27、eax ; GdtPtr + 2 <- gdt 基地址 ; 加載 GDTR lgdt GdtPtr ; GdtPtr -> lgdt ; 關(guān)中斷 cli ; 打開地址線A20 in al, 92h or al, 00000010b out 92h, al ; 準(zhǔn)備切換到保護模式,CRO第0位置置1 mov eax, cr0 or eax, 1 mov cr0, eax ; 真正進入保護模式 jmp dword SelectorCode32:0 ; 執(zhí)行這一句會把 SelectorCode32 裝入 cs, 并跳轉(zhuǎn)到 Code32Selector:0 處; LABEL_DESC_CO

28、DE32已經(jīng)準(zhǔn)備好,其中的基址就是LABEL_SEG_CODE32地址處; END of SECTION .s16SECTION .s32; 32 位代碼段. 由實模式跳入.BITS 32LABEL_SEG_CODE32: mov ax, SelectorVideo mov gs, ax ; 視頻段選擇子(目的) -> GS (段值) mov edi, (80 * 10 + 0) * 2 ; 屏幕第 10 行, 第 0 列。 mov ah, 0Ch ; 0000: 黑底 1100: 紅字 mov al, 'P' mov gs:edi, ax ; 到此停止 jmp $Seg

29、Code32Len equ $-LABEL_SEG_CODE32; END of SECTION .s32l pm.inc工具程序; GDT參數(shù)描述符類型值說明 ; 其中: ; DA_ : Descriptor Attribute / ; D : 數(shù)據(jù)段 / ; C : 代碼段 / ; S : 系統(tǒng)段 ; R : 只讀 / ; RW : 讀寫 / ; A : 已訪問DA_32 equ4000h; 32 位段DA_DPL0 equ00h; DPL = 0DA_DPL1 equ 20h; DPL = 1DA_DPL2 equ 40h; DPL = 2DA_DPL3 equ 60h; DPL = 3

30、; 存儲段描述符類型值說明DA_DR equ90h; 存在的只讀數(shù)據(jù)段類型值DA_DRW equ 92h; 存在的可讀寫數(shù)據(jù)段屬性值DA_DRWA equ 93h; 存在的已訪問可讀寫數(shù)據(jù)段類型值DA_C equ 98h; 存在的只執(zhí)行代碼段屬性值DA_CR equ 9Ah; 存在的可執(zhí)行可讀代碼段屬性值 DA_CCO equ 9Ch; 存在的只執(zhí)行一致代碼段屬性值 DA_CCOR equ 9Eh; 存在的可執(zhí)行可讀一致代碼段屬性值 ; 系統(tǒng)段描述符類型值說明DA_LDT equ 82h; 局部描述符表段類型值 DA_TaskGate equ 85h; 任務(wù)門類型值 DA_386TSS equ

31、 89h; 可用 386 任務(wù)狀態(tài)段類型值 DA_386CGate equ 8Ch; 386 調(diào)用門類型值 DA_386IGate equ 8Eh; 386 中斷門類型值 DA_386TGate equ 8Fh; 386 陷阱門類型值 ; RPL(Requested Privilege Level): 請求特權(quán)級,用于特權(quán)檢查。 ; TI(Table Indicator): 引用描述符表指示位 ; TI=0 指示從全局描述符表GDT中讀取描述符; ; TI=1 指示從局部描述符表LDT中讀取描述符。; 選擇子類型值說明 ; 其中: SA_ : Selector AttributeSA_RPL0

32、 equ 0; SA_RPL1 equ 1 ; RPLSA_RPL2 equ 2 ; SA_RPL3 equ 3 ; SA_TIG equ 0 ; TISA_TIL equ 4 ; ;定義描述符(64位); usage: Descriptor Base, Limit, Attr ; Base: dd (32位); Limit: dd(低20位可用) ; Attr: dw (高字節(jié)的低4位為0)%macro Descriptor 3 dw %2 & 0ffffh; 段界限 1 (2 字節(jié)) dw %1 & 0ffffh; 段基址 1 (2 字節(jié)) db (%1 >>

33、16) & 0ffh; 段基址 2 (1 字節(jié)) dw (%2 >> 8) & 0f00h | (%3 & 0f0ffh); 屬性 1 + 段界限 2 + 屬性 2 (2 字節(jié)) db (%1 >> 24) & 0ffh; 段基址 3 (1 字節(jié))%endmacro; 共 8 字節(jié); 代碼段和數(shù)據(jù)段描述符BYTE7BYTE6BYTE5BYTE4BYTE3BYTE2BYTE1BYTE031.24段基址3屬性(見下表)23.16段基址215.0段基址115.0段界限1; 屬性內(nèi)容7654321076543210GD/B0AVL19.16 段界

34、限2PDPLSTYPE; 屬性頁說明屬性概括說明具體說明P存在位(Present)P=1段在內(nèi)存中存在P=0段在內(nèi)存中不存在DPL表示描述符特權(quán)級(Descriptor Privilege Level)它規(guī)定了段的特權(quán)級特權(quán)級范圍:03S說明描述符的類型S=1數(shù)據(jù)段和代碼段描述符S=0系統(tǒng)段描述符和門描述符TYPE描述符類型描述符類型TYPE值說明數(shù)據(jù)段描述符S=10只讀1只讀,已訪問2讀/寫3讀/寫,已訪問4只讀,向下擴展5只讀,向下擴展,已訪問6讀/寫,向下擴展7讀/寫,向下擴展,已訪問代碼段描述符S=18只執(zhí)行9只執(zhí)行,已訪問A執(zhí)行/讀B執(zhí)行/讀,已訪問C只執(zhí)行,一致碼段D只執(zhí)行,一致碼

35、段,已訪問E執(zhí)行/讀,一致碼段F執(zhí)行/讀,一致碼段,已訪問系統(tǒng)端描述符和門描述符S=00<未定義>1可用286TSS2LDT3忙的286TSS4286調(diào)用門5任務(wù)門6286中斷門7286陷阱門8<未定義>9可用386TSSA<未定義>B忙的386TSSC386調(diào)用門D<未定義>E386中斷門F386陷阱門G段界限粒度位(Granularity)G=0段界限粒度為字節(jié)G=1段界限粒度為4KBD/B這一位比較復(fù)雜,分三種情況在可執(zhí)行代碼段描述符中,這一位叫做D位D=1默認(rèn)情況下,指令使用32位地址以及32位或8位操作數(shù)D=0默認(rèn)情況下,使用16位地址

36、及16位及8位操作數(shù)在向下擴展數(shù)據(jù)段的描述符中,這一位叫做B位D=1表示段的上部界限為4GBD=0表示段的上部界限為64KB在描述堆棧段的描述符中,這一位叫做B位D=1隱式的堆棧訪問指令(如push、pop和call)使用32位堆棧指令寄存器espD=0隱式的堆棧訪問指令(如push、pop和call)使用16位堆棧指令寄存器spAVL保留并可用位保留位,可以被系統(tǒng)軟件使用;定義門; usage: Gate Selector, Offset, DCount, Attr ; Selector: dw ; Offset: dd ; DCount: db ; Attr: db%macro Gate

37、4 dw (%2 & 0FFFFh); 偏移 1 (2 字節(jié)) dw %1; 選擇子 (2 字節(jié)) dw (%3 & 1Fh)|(%4<<8)&0FF00h); 屬性 (2 字節(jié)) dw (%2>>16)&0FFFFh); 偏移 2 (2 字節(jié))%endmacro ; 共 8 字節(jié)關(guān)于c11_mbr.asm的進階說明一. 顯示結(jié)果:第十行第0列打印一個紅色的P,如圖12-2所示。二. GDT進階說明GDT是Protected Mode所必須的數(shù)據(jù)結(jié)構(gòu),那么在進入Protected Mode之前,必須設(shè)定好GDT,并通過LGDT將其裝入相應(yīng)

38、的寄存器。盡管GDT允許被放在內(nèi)存的任何位置,但由于GDT中的元素描述符都是64-bit長,也就是說都是8個字節(jié),所以為了讓CPU對GDT的訪問速度達到最快,應(yīng)該將GDT的入口地址放在以8個字節(jié)對齊,也就是說是8的倍數(shù)的地址位置。GDT中第一個描述符必須是一個空描述符,也就是它的內(nèi)容應(yīng)該全部為0。如果引用這個描述符進行內(nèi)存訪問,則產(chǎn)生General Protection異常。如果一個OS不使用虛擬內(nèi)存,段模式會是一個不錯的選擇。但現(xiàn)代OS沒有不使用虛擬內(nèi)存的,而實現(xiàn)虛擬內(nèi)存的比較方便和有效的內(nèi)存管理方式是頁式管理。在IA-32上如果我們想使用頁式管理,我們只能使用段頁式?jīng)]有方法可以完全禁止段模式。但我們可以盡力讓段的效果降低的最小。IA-32提供了一種被稱作“Basic Flat Model”的分段模式可以達到這種效果。這種模式要求在GDT中至少要定義兩個段描述符,一個用來引用Data Segment,另一個用來引用Code Segment。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論