




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、內存管理與保護模式本實驗討論x86采用的內存管理模式:從分段實模式到分段保護模式,再到分頁虛擬內存管理,并介紹進入保護模式、啟動分頁機制、以及獲取內存大小的基本方法。1 x86的內存管理內存的分段(segmentation)管理符合程序的邏輯結構,利于程序的保護和動態控制。分頁(paging)則最適合虛擬內存的管理需要。目前主流操作系統的內存管理采用的是分頁方法(如類Unix),也有采用段頁式的(如Wiondows)。Intel 8086支持不帶保護功能的分段內存管理,80286開始引入帶保護功能的分段內存管理,80386又引入了支持虛擬內存的分頁內存管理,但其分頁是建立在分段基礎上的。IA-
2、32和x64處理器,都支持段頁式內存管理。1.1 實模式Intel的16位處理器8086,采用的是分段內存管理,CPU中有CS、DS、SS和ES四個16位段寄存器,作為基地址,分別用于生成代碼、數據、堆棧和其他段的物理地址:20位物理地址 = 16位段寄存器值*16(或左移4位) + 16位偏移量尋址空間只有(220=)1MB,最大段長為(216=)64KB。因為這樣的CPU只能生成和訪問真實的物理內存地址,所以被稱為實地址模式(real-address mode),簡稱為實模式(real mode)。不過這種分段方法并不是現代的分段技術,沒有提供任何內存保護功能,不能阻止內存的越界訪問。而且
3、8086 CPU也沒有提供任何特權分級,誰都可以任意改變CS、DS和SS寄存器中的值,從而可以執行/訪問內存任何地址的指令/數據,完全沒有安全可言。因此在8086 CPU上,是不可能構建現代操作系統的。1.2 保護模式1982年推出的16位的80286處理器,在x86體系中首次引入了(分段式的)內存保護機制,稱之為保護模式(protected mode)。不過80286的保護模式只支持24位的地址空間(最多只能訪問16MB內存)和16位的界限大小(最大段長為216=64KB或216+8=224=16MB),且只能從實模式進入保護模式,而不能從保護模式返回實模式。1985年推出的32位的8038
4、6處理器,其保護模式支持32位的地址空間,尋址空間達到(232=)4GB。但是為了與分段式的8086兼容,80386并沒有使用簡單的線性地址空間,而是采用了基于分段的分頁內存管理方法(其中的分頁管理是80386新增加的)。這里的分段是必須的,分頁則是可選的。1分段分段將處理器可尋址的內存空間(稱為線性地址空間)劃分為較小的受保護的地址空間(稱為段),段可用于容納程序的代碼、數據和堆棧,或系統的數據結構(如TSS或LDT)。可以為每個運行的程序指派各自的段集。分段機制還允許將段分類,從而可限制在某個特定段類上能夠執行的操作。為了定位特定段中的字節,必須提供一個邏輯地址(也稱為遠指針),它包含一個
5、段選擇符和一個偏移量。段選擇符是段唯一的標識符,它提供段描述符在描述符表中的偏移量。段描述符指定段的大小、訪問權限和特權級、段類型、段在線性地址空間中的起始地址(基址)。段的基址+偏移量=處理器線性地址空間中的線性地址。2分頁如果不使用分頁,則IA-32處理器的線性地址空間直接映射到處理器的物理地址空間,不支持虛擬內存管理。對IA-32處理器,只有分頁機制才支持虛擬內存,使處理器的線性地址空間可以大于內存的物理地址空間。但是IA-32處理器的分頁是建立在分段的基礎之上的,即IA-32處理器采用的是段頁式內存管理方法。在使用分頁管理時,每個段被分成若干等長的頁(對IA-32處理器,典型的頁幀大小
6、是4KB),這些頁可以存放在內存中,也可以存放在磁盤上(即支持虛擬內存)。當程序或任務試圖訪問線性地址空間中的地址位置時,處理器利用頁目錄和頁表,將線性地址轉換為物理地址。為了節省內存空間,IA-32處理器采用的是兩級分頁方式。如果采用單級分頁,對4KB(=212)頁幀大小和4GB地址空間,需要1M(=220)個表項,每個表項4B則整個頁表就需要4MB空間。由于一般的進程并不需要使用整個4GB的空間,所以大多數表項都空著的,非常浪費。如果采用二級分頁,一級為頁目錄(Page Directory,PD),有(210=)1024個頁目錄項(Page Directory Entry,PDE)。每個頁
7、目錄項指向一個二級頁表(Page Table,PT),它也有(210=)1024個頁表項(Page Table Entry,PTE),總共也是(1024*1024=220=)1M個頁。但對空頁目錄項,不必創建其對應的頁表,可以節省空間。31222112110頁目錄項序號dir頁表項序號table頁幀內偏移量offset4KB分頁時的線性地址格式311211109876543210頁表起始物理地址的高20位IgnoredPSIgnAPCDPWTU/SR/WP4KB分頁時的PDE(頁目錄項)格式其中:l P = Present存在(=0:不在內存中,其余各位忽略、=1:在內存中,其余各位有意義)l
8、 R/W = Read / Write讀/寫(=0:只讀、=1:可寫)l U/S = User / Supervisor用戶/超級管理員(=0:系統權限、=1:用戶權限)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臟(即對應頁被軟件改寫過)(0:未臟、1:已臟)l PAT = 用于確定內存類型l G = Global全局(0:局部、1:全局)如果采用4MB頁幀大小,則只需要單級分頁(只需要頁目錄)即可。3122210頁目錄dir偏移量offset4MB分頁時的線性地址格式2 IA-32的尋址方式IA-32的分段保護模式下的邏輯地址由一個16位的段選擇符和一個32位的偏移量構成。2.1 段選擇符80386的8個通用寄存器和指令指針寄存器及標志寄存器都擴展成了32位(如EAX、ESP、EIP、EFLAGS,對應寄存器名前增加
10、了一個字母E,代表Extended擴展),但是仍然保留原來的段寄存器為16位不變,只是另外增加了兩個新的16位輔助段寄存器FS和GS(字母F和G沒有特殊的含義,只是跟隨在已有段寄存器字母CS、DS、ES之后的兩個英文字母而已),一共有6個段寄存器:代碼段的CS、數據段的DS、堆棧段的SS和3個輔助段寄存器ES、FS和GS。80386的主要寄存器但是在32位的保護模式下,這些16位的段寄存器的內容,不再是實模式下(最大64KB段長的)段基址,而是一種包含地址描述符結構數組(段表)的索引(index,下標)和特權級(privilege level)等設置的一種數據結構段選擇符(segment se
11、lector)。這里的索引(偏移值)指向全局或局部段描述符表(段表)中的一個(描述符)表項,因索引/偏移值為16位,而每個段描述符占8B,所以該偏移值的低3位必須為0(另外用作TI和RPL),只有段寄存器的高13位才有效,因此段描述符表中最多可有(216/8=213=)8192(=8K)個表項。其實在IA-32處理器中,除了6個可見的16位段寄存器外,還有隱藏不可見的與每個段寄存器對應的(64位)影子結構,用于實現分段管理中的保護功能。2.2 段描述符段選擇符指向段描述符表(segment descriptor table)中的一個段描述符表項,段描述符用于分段內存管理中的地址生成和保護。在段
12、描述符(表項)中,包含32位段基址、20位段界限和12個控制位,共計64位(8B)。為了與80286(48位6B的)段描述符中的24位基址和16位界限兼容,所以80386段描述符中的32位基址和20位界限在8字節的結構中并不是連續的(高8位基址和高4位界限被放在了新增加的2個高位字節中)。B31B24GD/B0AVL3210L19L16PDPLSTypeB23B16B15B0L15L015 0描述符其中:l L = limit界限(20位段的界限)l B = base基址(32位段的基地址)l Type(類型)占4個二進制位,從低到高依次為(對代碼段或數據段描述符):n A = access訪
13、問(=0:未被訪問、=1:已被訪問)n RW = read/write讀/寫數據段(=0:只讀不可寫數據段/只執行不可讀代碼段、=1:可讀寫數據段/可執行和讀代碼段)n ED/C = extend direction/conforming伸展方向/一致(=0:向上高地址伸展數據段/非一致代碼段、1:向下低地址伸展堆棧段/一致 代碼段)n E = code代碼(0:數據段包括堆棧、1:代碼段)l S = descriptor type描述符類型(=0:系統描述符、=1:代碼段或數據段描述符)l DPL = descriptor privilege level描述符特權級(03:本段的特權級為03
14、)l P = present存在(0:段不存在,描述符無意義、1:段存在,描述符含有效基址和界限)l AVL = available for System系統可用(始終設為0) l D/B = default operation size默認操作大小(0:16位段、1:32位段)l G = Granularity 粒度/段長的單位(=0:字節、=1:4KB=212B)下面是全局描述符的結構定義: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時單位為字節,G=1時的單位為4KB=212B。所以段描述符中20位段界限,最大(段長)可以是(220=)1MB或(220+12 = 232 =)4GB。(使用x86處理器的)Linux采用的是分頁內存管理,不支持內存的分段管理,就是利用粒度為4KB的段界限,將32位處理器所支持的整個4GB內存分為了一個段,繞開了x86默認的分段管理機制。如果描述符中的S控制位=0,則為
16、系統描述符,包括如下兩類:l 系統段描述符n LDT(Local Descriptor-Table,局部描述符表)段描述符n TSS(Task-State Segment,任務狀態段)描述符l 門描述符n 調用門(call-gate)描述符n 中斷門(interrupt-gate)描述符n 陷阱門(trap-gate)描述符n 任務門(task-gate)描述符系統描述符類型Type字段描述數值11109800000保留1000116位TSS(可用)20010LDT3001116位TSS(忙)4010016位調用門50101任務門6011016位中斷門7011116位陷阱門81000保留910
17、0132位TSS(可用)101010保留11101132位TSS(忙)12110032位調用門131101保留14111032位中斷門15111132位陷阱門2.3 描述符表l GDT(Global Descriptor Table,全局描述符表)是線性空間里的一種數據結構(本身不是一個段),每個系統都必須定義唯一一個GDT,可被系統中的所有程序和任務使用。GDT的基線性地址(8B對齊)和界限必須(使用LGDT指令)裝入GDTR寄存器。GDT的界限值為字節數。l LDT(Local Descriptor Table,局部描述符表)本身是一個段,可定義若干個,可被多個任務共享。LDT位于LDT類
18、型的系統段,GDT中必須包含一個LDT的段描述符。LDT使用其段選擇符訪問。為了在訪問LDT時消除地址轉換,LDT的段選擇符、基線性地址、界限、訪問權限被存儲在LDTR寄存器中。IDTR = Interrupt Descriptor Table Register,中斷描述符表寄存器3 保護模式IA-32架構的CPU支持4種操作模式:l 保護模式(protected mode)這是處理器的天然態(native state)。l 虛擬8086模式(virtual-8086 mode)不是一種實際的處理器模式,只是指在保護模式下可以直接執行實模式8086軟件的能力。l 實地址模式(Real-addr
19、ess mode)實現8086處理器的編程環境。在加電或重啟時,處理器被置于實地址模式。l SMM(System Management Mode,系統管理模式)為操作系統或執行程序提供一種實現平臺特定功能(如電源管理和系統安全)的透明機制。3.1 進入保護模式1進入保護模式的主要步驟l 準備GDTl 準備GDTR指針(48位GDT參數:16位界限與32位基址)l 用LGDT指令將GDT參數加載到寄存器GDTRl 關閉中斷l 打開A20地址線l 置CR0寄存器的PE位l 跳轉進入保護模式2常量與宏l NASM宏的定義與使用n 宏的定義格式:%macro 宏名 參數個數 ; (含諸參數的)指令序列
20、,在其中用%i來表示參數i%endmacron 宏的使用方法:宏名 參數1, 參數2, l (段)描述符格式:B31B24GD/B0AVL3210L19L16PDPLSTypeB23B16B15B0L15L015 0描述符格式D/B=1:32位段DPL=03:描述符特權級l 描述符類型常量與用于生成描述符(和門)宏的包含文件代碼(pm.inc);-; 在下列類型值命名中:; DA_ : Descriptor Attribute 描述符屬性; D : 數據段; C : 代碼段; S : 系統段; 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; 存在的只讀數據段類型值DA_DRWEQU92h; 存在的可讀寫數據段屬性值DA_DRWAEQU93h; 存在的已訪問可讀寫數據段類型值DA_CEQU98h; 存在的只執行代碼段屬性值DA_CREQU9Ah; 存在的可執行可讀代碼段屬性值DA_CCOEQU9Ch; 存在的只執行一致代碼段屬性值DA_CCOREQU9Eh; 存在的可執
22、行可讀一致代碼段屬性值; 系統段描述符類型DA_LDT EQU 82h; 局部描述符表段類型值DA_TaskGate EQU 85h; 任務門類型值DA_386TSS EQU 89h; 可用 386 任務狀態段類型值DA_386CGate EQU 8Ch; 386 調用門類型值DA_386IGate EQU 8Eh; 386 中斷門類型值DA_386TGate EQU 8Fh; 386 陷阱門類型值; RPL(Requested Privilege Level): 請求特權級,用于特權檢查。; 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 字節; 門; 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 字節; 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 結束; 定義48位的GDT參數結構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; 設置DS/ES/SS = CSmovds, axmoves, axmovss, axmovsp, 100h; 設置 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 作準備xoreax, eaxmovax, dsshleax,
29、 4addeax, LABEL_GDT; eax <- GDT基地址movdword GdtPtr + 2, eax; GdtPtr + 2 <- GDT基地址; 加載 GDTRlgdtGdtPtr; 關中斷cli; 打開地址線A20inal, 92horal, 00000010b ; or al, 2(關閉:and al,0FDh)out92h, al; 準備切換到保護模式(置CR0的PE位為1)moveax, cr0oreax, 1; PE = 1movcr0, eax; 真正進入保護模式jmpdword SelectorCode32:0; 執行這一句會把SelectorCod
30、e32 裝入cs,; 并跳轉到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$; 死循環SegCode32Lenequ$ - LABEL_SEG_CODE
31、32; END of SECTION .s324代碼解釋l 機器指令LGDT將48位GDT參數(參見下圖)加載到寄存器GDTR中,我們代碼中的GDT參數,用結構變量GdtPtr表示。471615032位GDT基址16位GDT界限下面是相關代碼:; 加載 GDTRlgdtGdtPtrl 打開A20地址線由于歷史原因,雖然8086處理器只有20位地址線(即只能尋址1MB地址空間),但是如果試圖訪問超過1MB的地址時,系統并不會發生異常,而只是回卷(wrap)尋址(忽略序號為20的第21位及以上的地址數據)。在推出80286后,不再回卷,可訪問超過1MB以上的地址空間。但為了保證對老軟件的兼容,IB
32、M想出了一個辦法使用Intel 8042鍵盤控制器(后來改用92h號端口的第二個二進制位)來控制20號(及以上)地址(Address)位,稱為A20線門(A20 line gate)或門A20(Gate-A20))。當A20打開時,不回卷,可訪問超過1MB以上的地址空間;當A20關閉時,則回卷,只能尋址1MB地址空間。在系統啟動時,主板上的系統BIOS會打開A20進行內存檢測,但在將控制轉交給操作系統(磁盤引導扇區)之前,會關閉A20。為了使用大于1MB的內存空間,在進入保護模式之前,我們先必須打開A20。下面是相關代碼:; 打開地址線A20inal, 92horal, 00000010bou
33、t92h, all 置CR0寄存器的PE位CR0是80386引入的4個32位的控制寄存器(Control Register)CR0CR3之一,包含若干控制處理器操作模式和狀態的系統控制標志。其中的最低位PE(Protection Enable,保護允許/激活保護)用于允許/禁止保護狀態。相關代碼:; 準備切換到保護模式(置CR0的PE位為1)moveax, cr0oreax, 1movcr0, eax控制寄存器l 跳轉進入保護模式雖然置CR0的PE=1后,系統已經允許在保護模式,但是此時的CS仍然是16位實模式下的值,必須通過一個特殊的跳轉指令,從我們程序前面的16位代碼(SECTION .s
34、16)跳轉到后面的32位代碼(SECTION .s32)。至此,才算真正完成從實模式到保護模式的轉換。相關代碼:; 真正進入保護模式jmpdword SelectorCode32:0; 執行這一句會把 SelectorCode32 裝入 cs,; 并跳轉到 Code32Selector:0 處注意,其中jmp指令的紅色的數據類型說明符dword(32位的雙字)是NASM特有的。4編譯運行編譯:nasm pmtest1.asm -o pmtest1.bin寫入:用FloppyWriter或WinHex將pmtest1.bin寫入軟盤映像的引導扇區,并在該扇區的結束處(1FEh)添加啟動扇區的結束
35、標55h和0aah測試:用Bochs虛擬機測試結果:運行結果如下圖所示:3.2 啟動分頁機制進入保護模式,只是啟動了分段機制,可以實現保護功能。但是如果要實現虛擬內存管理,還需要啟動可選的分頁機制。1啟動分頁機制的主要步驟l 準備PD和PTl 讓CR3指向PDl 置CR0寄存器的PG位l 短跳轉啟動分頁機制2匯編源代碼需要在原pm.inc中增加如下常量定義:; 為段描述符中屬性字對應控制位G(15b)的十六進制值,用于構造描述符DA_LIMIT_4KEQU8000h; 段界限粒度為 4K 字節;-; 分頁機制使用的常量說明; 為頁目錄項PDE和頁表項PTE中字對應屬性位的值,用于表項的初始化;
36、-PG_PEQU1; 頁存在屬性位PG_RWREQU0; R/W 屬性位值, 讀/執行PG_RWWEQU2; R/W 屬性位值, 讀/寫/執行PG_USSEQU0; U/S 屬性位值, 系統級PG_USUEQU4; U/S 屬性位值, 用戶級;-下面是進入保護模式并啟動分頁機制的測試程序的源代碼(pmtest2.asm):其中l 紅色部分為啟動分頁機制的代碼l 綠色部分為返回實模式的代碼l 其余部分為進入保護模式的代碼%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 結束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 ; 數據段ALIGN32BITS32LABEL_DATA:SPValueInRealModedw0; 字符串PMMessage:db"In Protect
41、Mode now. -", 0; 進入保護模式后顯示此字符串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; 初始化數據段描述符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 作準備xoreax, eaxmovax, dsshleax, 4addeax, LABEL_GDT; eax <- gdt 基地址movdword GdtPtr + 2, eax; GdtPtr + 2 <- gdt 基地址; 加載 GDTRlgdtGdtPtr; 關中斷cli; 打開地址線
45、A20inal, 92horal, 00000010bout92h, al; 準備切換到保護模式moveax, cr0oreax, 1movcr0, eax; 真正進入保護模式jmpdword SelectorCode32:0; 執行這一句會把SelectorCode32裝入cs, ; 并跳轉到Code32Selector:0處;LABEL_REAL_ENTRY:; 從保護模式跳回到實模式就到了這里movax, csmovds, axmoves, axmovss, axmovsp, SPValueInRealModeinal, 92h; andal, 11111101b; 關閉 A20 地址線
46、out92h, al; sti; 開中斷movax, 4c00h; int21h; 回到 DOS; END of SECTION .s16SECTION .s32; 32 位代碼段. 由實模式跳入.BITS32LABEL_SEG_CODE32:callSetupPagingmovax, SelectorDatamovds, ax; 數據段選擇符movax, SelectorVideomovgs, ax; 視頻段選擇符movax, SelectorStackmovss, ax; 堆棧段選擇符movesp, TopOfStack; 下面顯示一個字符串movah, 0Ch; 0000: 黑底 110
47、0: 紅字xoresi, esixoredi, edimovesi, OffsetPMMessage; 源數據偏移movedi, (80 * 10 + 0) * 2; 目的數據偏移。屏幕第 10 行, 第 0 列。cld.1:lodsbtestal, aljz.2movgs:edi, axaddedi, 2jmp.1.2:; 顯示完畢; 到此停止jmpSelectorCode16:0; 啟動分頁機制 -SetupPaging:; 為簡化處理, 所有線性地址對應相等的物理地址.; 首先初始化頁目錄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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海海事職業技術學院《能源生產解決方案》2023-2024學年第二學期期末試卷
- 彭水雙拼別墅施工方案
- 威海鋼質潔凈門施工方案
- 2025簡化版企業抵押借款合同范本
- 2025至2030年中國錦一氫絕緣紙數據監測研究報告
- 2025我愛我家房屋買賣合同范本
- 2025至2030年中國離子選擇電極數據監測研究報告
- 2025至2030年中國電離子魔術球數據監測研究報告
- 2025至2030年中國靈是雕塑數據監測研究報告
- 2025至2030年中國植絨吸塑盤數據監測研究報告
- 酒店露營基地項目計劃書
- 小學趣味科學 3D打印技術 課件
- 輕量化目標檢測模型的研究
- 醫療器械人因工程與可用性測試總結
- 管道中的流量與壓強的關系及特殊情況分析
- 完整版工資條模板
- 藥品配送投標方案(技術標)
- 中風病臨床路徑及表單
- 核心素養背景下的高中數學課堂教學策略研究
- (完整版)附:《檔案目錄清單》
- 消化內科藥物臨床試驗標準操作規程SOP
評論
0/150
提交評論