內(nèi)存管理與保護(hù)模式_第1頁
內(nèi)存管理與保護(hù)模式_第2頁
內(nèi)存管理與保護(hù)模式_第3頁
內(nèi)存管理與保護(hù)模式_第4頁
內(nèi)存管理與保護(hù)模式_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、內(nèi)存管理與保護(hù)模式本實驗討論x86采用的內(nèi)存管理模式:從分段實模式到分段保護(hù)模式,再到分頁虛擬內(nèi)存管理,并介紹進(jìn)入保護(hù)模式、啟動分頁機(jī)制、以及獲取內(nèi)存大小的基本方法。1 x86的內(nèi)存管理內(nèi)存的分段(segmentation)管理符合程序的邏輯結(jié)構(gòu),利于程序的保護(hù)和動態(tài)控制。分頁(paging)則最適合虛擬內(nèi)存的管理需要。目前主流操作系統(tǒng)的內(nèi)存管理采用的是分頁方法(如類Unix),也有采用段頁式的(如Wiondows)。Intel 8086支持不帶保護(hù)功能的分段內(nèi)存管理,80286開始引入帶保護(hù)功能的分段內(nèi)存管理,80386又引入了支持虛擬內(nèi)存的分頁內(nèi)存管理,但其分頁是建立在分段基礎(chǔ)上的。IA-

2、32和x64處理器,都支持段頁式內(nèi)存管理。1.1 實模式Intel的16位處理器8086,采用的是分段內(nèi)存管理,CPU中有CS、DS、SS和ES四個16位段寄存器,作為基地址,分別用于生成代碼、數(shù)據(jù)、堆棧和其他段的物理地址:20位物理地址 = 16位段寄存器值*16(或左移4位) + 16位偏移量尋址空間只有(220=)1MB,最大段長為(216=)64KB。因為這樣的CPU只能生成和訪問真實的物理內(nèi)存地址,所以被稱為實地址模式(real-address mode),簡稱為實模式(real mode)。不過這種分段方法并不是現(xiàn)代的分段技術(shù),沒有提供任何內(nèi)存保護(hù)功能,不能阻止內(nèi)存的越界訪問。而且

3、8086 CPU也沒有提供任何特權(quán)分級,誰都可以任意改變CS、DS和SS寄存器中的值,從而可以執(zhí)行/訪問內(nèi)存任何地址的指令/數(shù)據(jù),完全沒有安全可言。因此在8086 CPU上,是不可能構(gòu)建現(xiàn)代操作系統(tǒng)的。1.2 保護(hù)模式1982年推出的16位的80286處理器,在x86體系中首次引入了(分段式的)內(nèi)存保護(hù)機(jī)制,稱之為保護(hù)模式(protected mode)。不過80286的保護(hù)模式只支持24位的地址空間(最多只能訪問16MB內(nèi)存)和16位的界限大?。ㄗ畲蠖伍L為216=64KB或216+8=224=16MB),且只能從實模式進(jìn)入保護(hù)模式,而不能從保護(hù)模式返回實模式。1985年推出的32位的8038

4、6處理器,其保護(hù)模式支持32位的地址空間,尋址空間達(dá)到(232=)4GB。但是為了與分段式的8086兼容,80386并沒有使用簡單的線性地址空間,而是采用了基于分段的分頁內(nèi)存管理方法(其中的分頁管理是80386新增加的)。這里的分段是必須的,分頁則是可選的。1分段分段將處理器可尋址的內(nèi)存空間(稱為線性地址空間)劃分為較小的受保護(hù)的地址空間(稱為段),段可用于容納程序的代碼、數(shù)據(jù)和堆棧,或系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如TSS或LDT)??梢詾槊總€運行的程序指派各自的段集。分段機(jī)制還允許將段分類,從而可限制在某個特定段類上能夠執(zhí)行的操作。為了定位特定段中的字節(jié),必須提供一個邏輯地址(也稱為遠(yuǎn)指針),它包含一個

5、段選擇符和一個偏移量。段選擇符是段唯一的標(biāo)識符,它提供段描述符在描述符表中的偏移量。段描述符指定段的大小、訪問權(quán)限和特權(quán)級、段類型、段在線性地址空間中的起始地址(基址)。段的基址+偏移量=處理器線性地址空間中的線性地址。2分頁如果不使用分頁,則IA-32處理器的線性地址空間直接映射到處理器的物理地址空間,不支持虛擬內(nèi)存管理。對IA-32處理器,只有分頁機(jī)制才支持虛擬內(nèi)存,使處理器的線性地址空間可以大于內(nèi)存的物理地址空間。但是IA-32處理器的分頁是建立在分段的基礎(chǔ)之上的,即IA-32處理器采用的是段頁式內(nèi)存管理方法。在使用分頁管理時,每個段被分成若干等長的頁(對IA-32處理器,典型的頁幀大小

6、是4KB),這些頁可以存放在內(nèi)存中,也可以存放在磁盤上(即支持虛擬內(nèi)存)。當(dāng)程序或任務(wù)試圖訪問線性地址空間中的地址位置時,處理器利用頁目錄和頁表,將線性地址轉(zhuǎn)換為物理地址。為了節(jié)省內(nèi)存空間,IA-32處理器采用的是兩級分頁方式。如果采用單級分頁,對4KB(=212)頁幀大小和4GB地址空間,需要1M(=220)個表項,每個表項4B則整個頁表就需要4MB空間。由于一般的進(jìn)程并不需要使用整個4GB的空間,所以大多數(shù)表項都空著的,非常浪費。如果采用二級分頁,一級為頁目錄(Page Directory,PD),有(210=)1024個頁目錄項(Page Directory Entry,PDE)。每個頁

7、目錄項指向一個二級頁表(Page Table,PT),它也有(210=)1024個頁表項(Page Table Entry,PTE),總共也是(1024*1024=220=)1M個頁。但對空頁目錄項,不必創(chuàng)建其對應(yīng)的頁表,可以節(jié)省空間。31222112110頁目錄項序號dir頁表項序號table頁幀內(nèi)偏移量offset4KB分頁時的線性地址格式311211109876543210頁表起始物理地址的高20位IgnoredPSIgnAPCDPWTU/SR/WP4KB分頁時的PDE(頁目錄項)格式其中:l P = Present存在(=0:不在內(nèi)存中,其余各位忽略、=1:在內(nèi)存中,其余各位有意義)l

8、 R/W = Read / Write讀/寫(=0:只讀、=1:可寫)l U/S = User / Supervisor用戶/超級管理員(=0:系統(tǒng)權(quán)限、=1:用戶權(quán)限)l PWT = Page-level Write-Through頁級直接寫l PCD = Page-level Cache Disable頁級禁用緩存l A = Accessed訪問過(0:未訪問過、1:已訪問過)l Ign = Ignored被忽略l PS = Page Size頁大小(0:4KB、1:4MB)l Ignored被忽略311211109876543210頁幀起始物理地址的高20位IgnoredGPATDAPC

9、DPWTU/SR/WP4KB分頁時的PTE(頁表項)格式其中:l D = Dirty臟(即對應(yīng)頁被軟件改寫過)(0:未臟、1:已臟)l PAT = 用于確定內(nèi)存類型l G = Global全局(0:局部、1:全局)如果采用4MB頁幀大小,則只需要單級分頁(只需要頁目錄)即可。3122210頁目錄dir偏移量offset4MB分頁時的線性地址格式2 IA-32的尋址方式IA-32的分段保護(hù)模式下的邏輯地址由一個16位的段選擇符和一個32位的偏移量構(gòu)成。2.1 段選擇符80386的8個通用寄存器和指令指針寄存器及標(biāo)志寄存器都擴(kuò)展成了32位(如EAX、ESP、EIP、EFLAGS,對應(yīng)寄存器名前增加

10、了一個字母E,代表Extended擴(kuò)展),但是仍然保留原來的段寄存器為16位不變,只是另外增加了兩個新的16位輔助段寄存器FS和GS(字母F和G沒有特殊的含義,只是跟隨在已有段寄存器字母CS、DS、ES之后的兩個英文字母而已),一共有6個段寄存器:代碼段的CS、數(shù)據(jù)段的DS、堆棧段的SS和3個輔助段寄存器ES、FS和GS。80386的主要寄存器但是在32位的保護(hù)模式下,這些16位的段寄存器的內(nèi)容,不再是實模式下(最大64KB段長的)段基址,而是一種包含地址描述符結(jié)構(gòu)數(shù)組(段表)的索引(index,下標(biāo))和特權(quán)級(privilege level)等設(shè)置的一種數(shù)據(jù)結(jié)構(gòu)段選擇符(segment se

11、lector)。這里的索引(偏移值)指向全局或局部段描述符表(段表)中的一個(描述符)表項,因索引/偏移值為16位,而每個段描述符占8B,所以該偏移值的低3位必須為0(另外用作TI和RPL),只有段寄存器的高13位才有效,因此段描述符表中最多可有(216/8=213=)8192(=8K)個表項。其實在IA-32處理器中,除了6個可見的16位段寄存器外,還有隱藏不可見的與每個段寄存器對應(yīng)的(64位)影子結(jié)構(gòu),用于實現(xiàn)分段管理中的保護(hù)功能。2.2 段描述符段選擇符指向段描述符表(segment descriptor table)中的一個段描述符表項,段描述符用于分段內(nèi)存管理中的地址生成和保護(hù)。在段

12、描述符(表項)中,包含32位段基址、20位段界限和12個控制位,共計64位(8B)。為了與80286(48位6B的)段描述符中的24位基址和16位界限兼容,所以80386段描述符中的32位基址和20位界限在8字節(jié)的結(jié)構(gòu)中并不是連續(xù)的(高8位基址和高4位界限被放在了新增加的2個高位字節(jié)中)。B31B24GD/B0AVL3210L19L16PDPLSTypeB23B16B15B0L15L015 0描述符其中:l L = limit界限(20位段的界限)l B = base基址(32位段的基地址)l Type(類型)占4個二進(jìn)制位,從低到高依次為(對代碼段或數(shù)據(jù)段描述符):n A = access訪

13、問(=0:未被訪問、=1:已被訪問)n RW = read/write讀/寫數(shù)據(jù)段(=0:只讀不可寫數(shù)據(jù)段/只執(zhí)行不可讀代碼段、=1:可讀寫數(shù)據(jù)段/可執(zhí)行和讀代碼段)n ED/C = extend direction/conforming伸展方向/一致(=0:向上高地址伸展數(shù)據(jù)段/非一致代碼段、1:向下低地址伸展堆棧段/一致 代碼段)n E = code代碼(0:數(shù)據(jù)段包括堆棧、1:代碼段)l S = descriptor type描述符類型(=0:系統(tǒng)描述符、=1:代碼段或數(shù)據(jù)段描述符)l DPL = descriptor privilege level描述符特權(quán)級(03:本段的特權(quán)級為03

14、)l P = present存在(0:段不存在,描述符無意義、1:段存在,描述符含有效基址和界限)l AVL = available for System系統(tǒng)可用(始終設(shè)為0) l D/B = default operation size默認(rèn)操作大?。?:16位段、1:32位段)l G = Granularity 粒度/段長的單位(=0:字節(jié)、=1:4KB=212B)下面是全局描述符的結(jié)構(gòu)定義:struct gdt_entry unsigned short limit_low; unsigned short base_low; unsigned char base_middle; unsign

15、ed char access; unsigned char granularity; unsigned char base_high; _attribute_(packed);因為段描述符中的控制位G可以指定段長的單位,G=0時單位為字節(jié),G=1時的單位為4KB=212B。所以段描述符中20位段界限,最大(段長)可以是(220=)1MB或(220+12 = 232 =)4GB。(使用x86處理器的)Linux采用的是分頁內(nèi)存管理,不支持內(nèi)存的分段管理,就是利用粒度為4KB的段界限,將32位處理器所支持的整個4GB內(nèi)存分為了一個段,繞開了x86默認(rèn)的分段管理機(jī)制。如果描述符中的S控制位=0,則為

16、系統(tǒng)描述符,包括如下兩類:l 系統(tǒng)段描述符n LDT(Local Descriptor-Table,局部描述符表)段描述符n TSS(Task-State Segment,任務(wù)狀態(tài)段)描述符l 門描述符n 調(diào)用門(call-gate)描述符n 中斷門(interrupt-gate)描述符n 陷阱門(trap-gate)描述符n 任務(wù)門(task-gate)描述符系統(tǒng)描述符類型Type字段描述數(shù)值11109800000保留1000116位TSS(可用)20010LDT3001116位TSS(忙)4010016位調(diào)用門50101任務(wù)門6011016位中斷門7011116位陷阱門81000保留910

17、0132位TSS(可用)101010保留11101132位TSS(忙)12110032位調(diào)用門131101保留14111032位中斷門15111132位陷阱門2.3 描述符表l GDT(Global Descriptor Table,全局描述符表)是線性空間里的一種數(shù)據(jù)結(jié)構(gòu)(本身不是一個段),每個系統(tǒng)都必須定義唯一一個GDT,可被系統(tǒng)中的所有程序和任務(wù)使用。GDT的基線性地址(8B對齊)和界限必須(使用LGDT指令)裝入GDTR寄存器。GDT的界限值為字節(jié)數(shù)。l LDT(Local Descriptor Table,局部描述符表)本身是一個段,可定義若干個,可被多個任務(wù)共享。LDT位于LDT類

18、型的系統(tǒng)段,GDT中必須包含一個LDT的段描述符。LDT使用其段選擇符訪問。為了在訪問LDT時消除地址轉(zhuǎn)換,LDT的段選擇符、基線性地址、界限、訪問權(quán)限被存儲在LDTR寄存器中。IDTR = Interrupt Descriptor Table Register,中斷描述符表寄存器3 保護(hù)模式IA-32架構(gòu)的CPU支持4種操作模式:l 保護(hù)模式(protected mode)這是處理器的天然態(tài)(native state)。l 虛擬8086模式(virtual-8086 mode)不是一種實際的處理器模式,只是指在保護(hù)模式下可以直接執(zhí)行實模式8086軟件的能力。l 實地址模式(Real-addr

19、ess mode)實現(xiàn)8086處理器的編程環(huán)境。在加電或重啟時,處理器被置于實地址模式。l SMM(System Management Mode,系統(tǒng)管理模式)為操作系統(tǒng)或執(zhí)行程序提供一種實現(xiàn)平臺特定功能(如電源管理和系統(tǒng)安全)的透明機(jī)制。3.1 進(jìn)入保護(hù)模式1進(jìn)入保護(hù)模式的主要步驟l 準(zhǔn)備GDTl 準(zhǔn)備GDTR指針(48位GDT參數(shù):16位界限與32位基址)l 用LGDT指令將GDT參數(shù)加載到寄存器GDTRl 關(guān)閉中斷l(xiāng) 打開A20地址線l 置CR0寄存器的PE位l 跳轉(zhuǎn)進(jìn)入保護(hù)模式2常量與宏l NASM宏的定義與使用n 宏的定義格式:%macro 宏名 參數(shù)個數(shù) ; (含諸參數(shù)的)指令序列

20、,在其中用%i來表示參數(shù)i%endmacron 宏的使用方法:宏名 參數(shù)1, 參數(shù)2, l (段)描述符格式:B31B24GD/B0AVL3210L19L16PDPLSTypeB23B16B15B0L15L015 0描述符格式D/B=1:32位段DPL=03:描述符特權(quán)級l 描述符類型常量與用于生成描述符(和門)宏的包含文件代碼(pm.inc);-; 在下列類型值命名中:; DA_ : Descriptor Attribute 描述符屬性; D : 數(shù)據(jù)段; C : 代碼段; S : 系統(tǒng)段; R : 只讀; RW : 讀寫; A : 已訪問; 其它 : 可按照字面意思理解;-; 描述符類型D

21、A_32EQU4000h; 32 位段DA_DPL0EQU 00h; DPL = 0DA_DPL1EQU 20h; DPL = 1DA_DPL2EQU 40h; DPL = 2DA_DPL3EQU 60h; DPL = 3; 存儲段描述符類型DA_DREQU90h; 存在的只讀數(shù)據(jù)段類型值DA_DRWEQU92h; 存在的可讀寫數(shù)據(jù)段屬性值DA_DRWAEQU93h; 存在的已訪問可讀寫數(shù)據(jù)段類型值DA_CEQU98h; 存在的只執(zhí)行代碼段屬性值DA_CREQU9Ah; 存在的可執(zhí)行可讀代碼段屬性值DA_CCOEQU9Ch; 存在的只執(zhí)行一致代碼段屬性值DA_CCOREQU9Eh; 存在的可執(zhí)

22、行可讀一致代碼段屬性值; 系統(tǒng)段描述符類型DA_LDT EQU 82h; 局部描述符表段類型值DA_TaskGate EQU 85h; 任務(wù)門類型值DA_386TSS EQU 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中讀

23、取描述符;;TI=1 指示從局部描述符表LDT中讀取描述符。;-; 選擇符類型值說明; 其中:; SA_ : Selector AttributeSA_RPL0EQU0; SA_RPL1EQU1; RPLSA_RPL2EQU2; SA_RPL3EQU3; SA_TIGEQU0; TISA_TILEQU4; ;-; 宏 -; 描述符; usage: Descriptor Base, Limit, Attr; Base: dd; Limit: dd (low 20 bits available); Attr: dw (lower 4 bits of higher byte are always 0

24、)%macro Descriptor 3dw%2 & 0FFFFh; 段界限1dw%1 & 0FFFFh; 段基址1db(%1 >> 16) & 0FFh; 段基址2dw(%2 >> 8) & 0F00h) | (%3 & 0F0FFh); 屬性1 + 段界限2 + 屬性2db(%1 >> 24) & 0FFh; 段基址3%endmacro ; 共 8 字節(jié); 門; usage: Gate Selector, Offset, DCount, Attr; Selector: dw; Offset: dd; DCo

25、unt: db; Attr: db%macro Gate 4dw(%2 & 0FFFFh); 偏移1dw%1; 選擇子dw(%3 & 1Fh) | (%4 << 8) & 0FF00h); 屬性dw(%2 >> 16) & 0FFFFh); 偏移2%endmacro ; 共 8 字節(jié); 3匯編源代碼l 測試程序(pmtest1.asm)%include"pm.inc" 常量, 宏, 以及一些說明org07c00hjmpLABEL_BEGINSECTION .gdt; GDT(定義全局描述符表。注意,為防止誤操作,首個G

26、DT表項必須為空); 段基址, 段界限, 屬性LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32; 非一致代碼段LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW; 顯存首地址; GDT 結(jié)束; 定義48位的GDT參數(shù)結(jié)構(gòu)GdtPtr(16位界限 + 32位基地址)GdtLenequ$ - LABEL_GDT; GDT長度GdtPtrdwGdtLen - 1; GDT界限dd0; GDT基地址;

27、 GDT 選擇符(定義代碼段和顯存段在GDT中的偏移量)SelectorCode32equLABEL_DESC_CODE32 - LABEL_GDT ; = 64SelectorVideoequLABEL_DESC_VIDEO- LABEL_GDT ; = 128; END of SECTION .gdtSECTION .s16BITS16LABEL_BEGIN:movax, cs; 設(shè)置DS/ES/SS = CSmovds, axmoves, axmovss, axmovsp, 100h; 設(shè)置 SP = 100h; 初始化 32 位代碼段描述符中的基址部分xoreax, eax; EAX

28、= 0movax, csshleax, 4; EAX = 代碼段基址addeax, LABEL_SEG_CODE32; EAX + 偏移地址 = 32位代碼段起始地址movword LABEL_DESC_CODE32 + 2, ax; B015 = AXshreax, 16; EAX >> 16(AX = EAX的高16位)movbyte LABEL_DESC_CODE32 + 4, al; B1623 = ALmovbyte LABEL_DESC_CODE32 + 7, ah; B2431 = AH; 為加載 GDTR 作準(zhǔn)備xoreax, eaxmovax, dsshleax,

29、 4addeax, LABEL_GDT; eax <- GDT基地址movdword GdtPtr + 2, eax; GdtPtr + 2 <- GDT基地址; 加載 GDTRlgdtGdtPtr; 關(guān)中斷cli; 打開地址線A20inal, 92horal, 00000010b ; or al, 2(關(guān)閉:and al,0FDh)out92h, al; 準(zhǔn)備切換到保護(hù)模式(置CR0的PE位為1)moveax, cr0oreax, 1; PE = 1movcr0, eax; 真正進(jìn)入保護(hù)模式j(luò)mpdword SelectorCode32:0; 執(zhí)行這一句會把SelectorCod

30、e32 裝入cs,; 并跳轉(zhuǎn)到Code32Selector:0處; END of SECTION .s16SECTION .s32; 32 位代碼段. 由實模式跳入.BITS32LABEL_SEG_CODE32:movax, SelectorVideomovgs, ax; 視頻段選擇符(目的)movedi, (80 * 11 + 79) * 2; 屏幕第 11 行, 第 79 列。movah, 0Ch; 0000: 黑底 1100: 紅字moval, 'P'movgs:edi, ax; 到此停止jmp$; 死循環(huán)SegCode32Lenequ$ - LABEL_SEG_CODE

31、32; END of SECTION .s324代碼解釋l 機(jī)器指令LGDT將48位GDT參數(shù)(參見下圖)加載到寄存器GDTR中,我們代碼中的GDT參數(shù),用結(jié)構(gòu)變量GdtPtr表示。471615032位GDT基址16位GDT界限下面是相關(guān)代碼:; 加載 GDTRlgdtGdtPtrl 打開A20地址線由于歷史原因,雖然8086處理器只有20位地址線(即只能尋址1MB地址空間),但是如果試圖訪問超過1MB的地址時,系統(tǒng)并不會發(fā)生異常,而只是回卷(wrap)尋址(忽略序號為20的第21位及以上的地址數(shù)據(jù))。在推出80286后,不再回卷,可訪問超過1MB以上的地址空間。但為了保證對老軟件的兼容,IB

32、M想出了一個辦法使用Intel 8042鍵盤控制器(后來改用92h號端口的第二個二進(jìn)制位)來控制20號(及以上)地址(Address)位,稱為A20線門(A20 line gate)或門A20(Gate-A20))。當(dāng)A20打開時,不回卷,可訪問超過1MB以上的地址空間;當(dāng)A20關(guān)閉時,則回卷,只能尋址1MB地址空間。在系統(tǒng)啟動時,主板上的系統(tǒng)BIOS會打開A20進(jìn)行內(nèi)存檢測,但在將控制轉(zhuǎn)交給操作系統(tǒng)(磁盤引導(dǎo)扇區(qū))之前,會關(guān)閉A20。為了使用大于1MB的內(nèi)存空間,在進(jìn)入保護(hù)模式之前,我們先必須打開A20。下面是相關(guān)代碼:; 打開地址線A20inal, 92horal, 00000010bou

33、t92h, all 置CR0寄存器的PE位CR0是80386引入的4個32位的控制寄存器(Control Register)CR0CR3之一,包含若干控制處理器操作模式和狀態(tài)的系統(tǒng)控制標(biāo)志。其中的最低位PE(Protection Enable,保護(hù)允許/激活保護(hù))用于允許/禁止保護(hù)狀態(tài)。相關(guān)代碼:; 準(zhǔn)備切換到保護(hù)模式(置CR0的PE位為1)moveax, cr0oreax, 1movcr0, eax控制寄存器l 跳轉(zhuǎn)進(jìn)入保護(hù)模式雖然置CR0的PE=1后,系統(tǒng)已經(jīng)允許在保護(hù)模式,但是此時的CS仍然是16位實模式下的值,必須通過一個特殊的跳轉(zhuǎn)指令,從我們程序前面的16位代碼(SECTION .s

34、16)跳轉(zhuǎn)到后面的32位代碼(SECTION .s32)。至此,才算真正完成從實模式到保護(hù)模式的轉(zhuǎn)換。相關(guān)代碼:; 真正進(jìn)入保護(hù)模式j(luò)mpdword SelectorCode32:0; 執(zhí)行這一句會把 SelectorCode32 裝入 cs,; 并跳轉(zhuǎn)到 Code32Selector:0 處注意,其中jmp指令的紅色的數(shù)據(jù)類型說明符dword(32位的雙字)是NASM特有的。4編譯運行編譯:nasm pmtest1.asm -o pmtest1.bin寫入:用FloppyWriter或WinHex將pmtest1.bin寫入軟盤映像的引導(dǎo)扇區(qū),并在該扇區(qū)的結(jié)束處(1FEh)添加啟動扇區(qū)的結(jié)束

35、標(biāo)55h和0aah測試:用Bochs虛擬機(jī)測試結(jié)果:運行結(jié)果如下圖所示:3.2 啟動分頁機(jī)制進(jìn)入保護(hù)模式,只是啟動了分段機(jī)制,可以實現(xiàn)保護(hù)功能。但是如果要實現(xiàn)虛擬內(nèi)存管理,還需要啟動可選的分頁機(jī)制。1啟動分頁機(jī)制的主要步驟l 準(zhǔn)備PD和PTl 讓CR3指向PDl 置CR0寄存器的PG位l 短跳轉(zhuǎn)啟動分頁機(jī)制2匯編源代碼需要在原pm.inc中增加如下常量定義:; 為段描述符中屬性字對應(yīng)控制位G(15b)的十六進(jìn)制值,用于構(gòu)造描述符DA_LIMIT_4KEQU8000h; 段界限粒度為 4K 字節(jié);-; 分頁機(jī)制使用的常量說明; 為頁目錄項PDE和頁表項PTE中字對應(yīng)屬性位的值,用于表項的初始化;

36、-PG_PEQU1; 頁存在屬性位PG_RWREQU0; R/W 屬性位值, 讀/執(zhí)行PG_RWWEQU2; R/W 屬性位值, 讀/寫/執(zhí)行PG_USSEQU0; U/S 屬性位值, 系統(tǒng)級PG_USUEQU4; U/S 屬性位值, 用戶級;-下面是進(jìn)入保護(hù)模式并啟動分頁機(jī)制的測試程序的源代碼(pmtest2.asm):其中l(wèi) 紅色部分為啟動分頁機(jī)制的代碼l 綠色部分為返回實模式的代碼l 其余部分為進(jìn)入保護(hù)模式的代碼%include"pm.inc" 常量, 宏, 以及一些說明PageDirBaseequ200000h; 頁目錄開始地址: 2MPageTblBaseequ2

37、01000h; 頁表開始地址: 2M+4Korg0100hjmpLABEL_BEGINSECTION .gdt; GDT; 段基址, 段界限, 屬性LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符LABEL_DESC_NORMAL: Descriptor 0, 0ffffh, DA_DRW; Normal 描述符LABEL_DESC_PAGE_DIR: Descriptor PageDirBase, 4095, DA_DRW ; Page DirectoryLABEL_DESC_PAGE_TBL: Descriptor PageTblBase, 1023, DA_DRW

38、|DA_LIMIT_4K ; Page TablesLABEL_DESC_CODE32: Descriptor 0, SegCode32Len-1, DA_C+DA_32; 非一致代碼段, 32LABEL_DESC_CODE16: Descriptor 0, 0ffffh, DA_C; 非一致代碼段, 16LABEL_DESC_DATA: Descriptor 0, DataLen-1, DA_DRW; DataLABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWA + DA_32 ; Stack, 32 位LABEL_DESC_VIDEO: D

39、escriptor 0B8000h, 0ffffh, DA_DRW ; 顯存首地址; GDT 結(jié)束GdtLenequ$ - LABEL_GDT; GDT長度GdtPtrdwGdtLen - 1; GDT界限dd0; GDT基地址; GDT 選擇符SelectorNormalequLABEL_DESC_NORMAL- LABEL_GDTSelectorPageDirequLABEL_DESC_PAGE_DIR- LABEL_GDTSelectorPageTblequLABEL_DESC_PAGE_TBL- LABEL_GDTSelectorCode32equLABEL_DESC_CODE32-

40、LABEL_GDTSelectorCode16equLABEL_DESC_CODE16- LABEL_GDTSelectorDataequLABEL_DESC_DATA- LABEL_GDTSelectorStackequLABEL_DESC_STACK- LABEL_GDTSelectorVideoequLABEL_DESC_VIDEO- LABEL_GDT; END of SECTION .gdtSECTION .data1 ; 數(shù)據(jù)段ALIGN32BITS32LABEL_DATA:SPValueInRealModedw0; 字符串PMMessage:db"In Protect

41、Mode now. -", 0; 進(jìn)入保護(hù)模式后顯示此字符串OffsetPMMessageequPMMessage - $DataLenequ$ - LABEL_DATA; END of SECTION .data1; 全局堆棧段SECTION .gsALIGN32BITS32LABEL_STACK:times 512 db 0TopOfStackequ$ - LABEL_STACK - 1; END of SECTION .gsSECTION .s16BITS16LABEL_BEGIN:movax, csmovds, axmoves, axmovss, axmovsp, 0100h

42、movLABEL_GO_BACK_TO_REAL+3, axmovSPValueInRealMode, sp; 初始化 16 位代碼段描述符movax, csmovzxeax, axshleax, 4addeax, LABEL_SEG_CODE16movword LABEL_DESC_CODE16 + 2, axshreax, 16movbyte LABEL_DESC_CODE16 + 4, almovbyte LABEL_DESC_CODE16 + 7, ah; 初始化 32 位代碼段描述符xoreax, eaxmovax, csshleax, 4addeax, LABEL_SEG_CODE

43、32movword LABEL_DESC_CODE32 + 2, axshreax, 16movbyte LABEL_DESC_CODE32 + 4, almovbyte LABEL_DESC_CODE32 + 7, ah; 初始化數(shù)據(jù)段描述符xoreax, eaxmovax, dsshleax, 4addeax, LABEL_DATAmovword LABEL_DESC_DATA + 2, axshreax, 16movbyte LABEL_DESC_DATA + 4, almovbyte LABEL_DESC_DATA + 7, ah; 初始化堆棧段描述符xoreax, eaxmovax,

44、 dsshleax, 4addeax, LABEL_STACKmovword LABEL_DESC_STACK + 2, axshreax, 16movbyte LABEL_DESC_STACK + 4, almovbyte LABEL_DESC_STACK + 7, ah; 為加載 GDTR 作準(zhǔn)備xoreax, eaxmovax, dsshleax, 4addeax, LABEL_GDT; eax <- gdt 基地址movdword GdtPtr + 2, eax; GdtPtr + 2 <- gdt 基地址; 加載 GDTRlgdtGdtPtr; 關(guān)中斷cli; 打開地址線

45、A20inal, 92horal, 00000010bout92h, al; 準(zhǔn)備切換到保護(hù)模式moveax, cr0oreax, 1movcr0, eax; 真正進(jìn)入保護(hù)模式j(luò)mpdword SelectorCode32:0; 執(zhí)行這一句會把SelectorCode32裝入cs, ; 并跳轉(zhuǎn)到Code32Selector:0處;LABEL_REAL_ENTRY:; 從保護(hù)模式跳回到實模式就到了這里movax, csmovds, axmoves, axmovss, axmovsp, SPValueInRealModeinal, 92h; andal, 11111101b; 關(guān)閉 A20 地址線

46、out92h, al; sti; 開中斷movax, 4c00h; int21h; 回到 DOS; END of SECTION .s16SECTION .s32; 32 位代碼段. 由實模式跳入.BITS32LABEL_SEG_CODE32:callSetupPagingmovax, SelectorDatamovds, ax; 數(shù)據(jù)段選擇符movax, SelectorVideomovgs, ax; 視頻段選擇符movax, SelectorStackmovss, ax; 堆棧段選擇符movesp, TopOfStack; 下面顯示一個字符串movah, 0Ch; 0000: 黑底 110

47、0: 紅字xoresi, esixoredi, edimovesi, OffsetPMMessage; 源數(shù)據(jù)偏移movedi, (80 * 10 + 0) * 2; 目的數(shù)據(jù)偏移。屏幕第 10 行, 第 0 列。cld.1:lodsbtestal, aljz.2movgs:edi, axaddedi, 2jmp.1.2:; 顯示完畢; 到此停止jmpSelectorCode16:0; 啟動分頁機(jī)制 -SetupPaging:; 為簡化處理, 所有線性地址對應(yīng)相等的物理地址.; 首先初始化頁目錄movax, SelectorPageDir; 此段首地址為 PageDirBasemoves, axmovecx, 1024; 共 1K 個表項xoredi, edixoreax, eaxmoveax, PageTblBase | PG_P | PG_USU | PG_RWW.1:st

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論