要理解gdt,先要理解什麼是實模式,什麼是保護模式。
我們知道,intel的8086是乙個16位的cpu,定址使用《段暫存器 :偏移位址》的方式來定址,8086有20根位址線,但是暫存器是16位的,怎樣才能定址1mb呢,很簡單,就是將段暫存器左移4位,然後加上偏移位址,即可得出20位的實體地址,此位址就可以直接定址1mb了,但是8086裡面沒有記憶體保護機制,這樣乙個程式就可以修改任意記憶體的值了,現代作業系統顯然不允許這樣做,如果乙個程式可以修改任意記憶體空間的值,那隨便乙個程式就把系統搞宕機了,然後出現了80286,80286位址線有24根,可以定址16mb,並且有記憶體保護機制,我今天要說的是80386以及後來出現的x86系列,80386位址線有32根,可以定址4gb的記憶體,那是不是就可以不用段暫存器了呢,intel為了向下相容,保留了這些段暫存器,那這些段暫存器用來幹嘛呢?在保護模式下,它用來儲存乙個索引,這個索引值就是gdt/ldt相對於gdtr的位置,80386啟動時處於實模式下,定址還是採用段暫存器左移4位加上偏移值來實現,定址能力還是1mb,啟動時,cs:ip=0xf000:0xfff0,計算得出實體地址為0xffff0,這個位址是存放bios程式的位址。進入保護模式是通過設定某乙個暫存器來實現的,進入保護模式之後,段暫存器還是16位的,不能表示32位的段位址,所以段暫存器的意義就發生了變化。
以乙個設計者的角度來講,我要定址記憶體某乙個位址,首先要給出實體地址對吧,並且還要用上段暫存器,那麼這個實體地址如何來呢,我給出乙個16位的段暫存器值,和乙個偏移值,如0x0012:0x00000000,那麼0x0012就是乙個段選擇符(選擇子),如下圖所示:
進入保護模式之後,cpu不會將它左移4位加上偏移值形成實體地址了,cpu先檢視0x0012的資訊,第0,1位是特權級,第2位表示gdt還是ldt,第3-15位就表示描述符在描述符表中的第幾個,0x0012=0000_0000_0001_0010,表示特權級2級,gdt,索引號為2,然後cpu就會到記憶體的某乙個位址出開始找到索引號為2的描述符,這個描述符裡面就儲存了32位的位址,然後將這個位址加上給出的偏移位址0x00000000得出實體地址(如果沒有分頁的話),那麼問題來了,cpu到哪個位置查詢描述符呢,所以就有乙個暫存器gdtr儲存了gdt的首位址,後面就跟著以8個位元組為單位的段描述符,乙個8位元組表示乙個段,這8個位元組表示了這個段的基位址,屬性,大小,許可權等資訊,這8個位元組如下圖所示,那麼要進入保護模式,就要先設定好gdt表和gdtr暫存器的值了,不然進入保護模式直接就會出錯。
所以總結一下,進入保護模式下後cpu的定址方式用下圖來描述:
參考書籍:orange』s:乙個作業系統的實現,建議看一下
gdt描述 GDT詳解(全域性描述符表)
gdt詳解 全域性描述符表 字型大小 小 中 大 在protected mode下,乙個重要的必不可少的資料結構就是gdt global descriptor table 為什麼要有gdt?我們首先考慮一下在real mode下的程式設計模型 在real mode下,我們對乙個記憶體位址的訪問是通過...
gdt描述 全域性描述符表(GDT)詳解
在protected mode下,乙個重要的必不可少的資料結構就是gdt global descriptor table 為什麼要有gdt real mode程式設計模型 我們首先考慮一下在real mode下的程式設計模型 在real mode下,我們對乙個記憶體位址的訪問是通過segment o...
gdt描述 GDT描述符表
一直以來,在直流電源埠的雷擊保護器件的選型方面,人們會選擇壓敏電阻mov,但是,由於壓敏電阻mov在失效時會引 災,而選擇常規氣體放電管gdt又會帶來續流問題,因此,結合壓敏電阻和氣體放電管兩種器件便成了電源埠的雷擊保護問題的完美解決方案。壓敏電阻器與氣體放電管串聯,在不影響壓敏保護水平的前提下,可...