Friday, May 16, 2008

Enable Protected Mode 的第一項基本功 - Global Descriptor Table 與 Segment Descriptor

如果你不會寫 Assembly 的話, 可能對 Segment 這個觀念會比較陌生.建議先練好基本的 Assembly 功夫, 並參閱相關書籍以熟悉 x86 CPU 的軟體架構.
中文資料的話推薦可以到小木偶的組合語言教學網頁看看.
Overview:一般傳統 Real Mode Segment Register 的可定址範圍都是 64KB, 也就是 16 bits. (例如: 0000h ~ FFFFh)
而 x86 CPU 進入 32bit Protected Mode 後, 原來的 DS, ES, FS, GS, SS 等 Segment Register (區段暫存器), 並不是像通用暫存器 (如: EAX, EBX, ECX, EDX) 那樣, 前面加個 ‘E’ (錯誤示範如: EDS, EES, EFS, EGS, ESS) 就可以直接定址到 4GB 的 Memory.
而是換了一個角色與名稱, 叫做 Segment Selector. (本身依然保持 16 Bit, DS, ES, FS, GS, SS)
但 16 bit Real Mode 的 Segment Register 與 32 bit Protected Mode 的 Segment Selector 在使用上有什麼差別呢?
有的. 傳統的 Segment Register 你只要直接載入想存取的區段的位址即可, 不需要有額外的配套措施.
例如你想存取 Memory 上的第 18000h Bytes (也就是 Linear Address 18000h),你只需要將 DS 載入為 1000h, 並將 BX 載入為 8000h, 如此便可存取到 Linear Address 18000h.
Ex:; 設定想存取的位址mov ax, 1000hmov ds, axmov bx, 8000h
; 從 18000h 讀取資料mov eax, ds:[bx]
但使用 Protected Mode 的 Segment Selector 則需要一些配套措施.就是必須先在 Memory 中建立一個 Global Descriptor Table (GDT) 後才能使用.
正確的說, Segment Selector 並不像 Real Mode 那樣是直接寫入想存取位置的位址.而是改為 “載入 Global Descriptor Table (GDT) 內, Segment Descriptor 的索引值”.
假設像這樣 (以下不是真實的範例):
<第零個 Segment Descriptor><第一個 Segment Descriptor><第二個 Segment Descriptor><第三個 Segment Descriptor>
; 將 DS 載入第二個 Segment Descriptor, 假設其範圍是 0 ~ 4GBmov ax, 02hmov ds, ax
; 設定想存取的位址mov ebx, 18000h
; 存取記憶體 18000hmov eax, ds:[ebx]
from http://osdevr.olux.org/

0 Comments:

Post a Comment

<< Home