為什麼全域性描述符表GDT的第0項總是乙個空描述符

2021-06-27 18:35:18 字數 770 閱讀 7223

為什麼全域性描述符表gdt的第0項總是乙個空描述符,而區域性描述符表卻不是這樣?

386的保護模式下:dt=gdt*1+idt*1+ldt*n

idt和每個ldt都要到gdt中報一次到。乙個描述符項與一張表對應。

什麼是描述表呢? 

其實很簡單。1個段描述表記錄乙個段的特徵資訊,中斷描述符表記錄中斷的埠和其對應的函式入口位址或門的入口函式位址,全域性描述表gdt記錄所有表的位址。其中的項稱之為描述符,就是這裡記錄cpl,dpl的資訊。

前面說到gdt和idt是整個系統的一張表,而ldt可以每個任務獨佔一長,用於儲存每個任務私有的段的資訊,所以當任務發生切換時,ldt也要隨之切換,cpu中專門用乙個16位的暫存器dtr來儲存當前任務的ldt在gdt中的描述符的選擇子,以此來定位當前任務的ldt。(這裡需要事先定義好tss段)

同時也存在這麼一種情況,那就是乙個任務使用的所有段都是系統全域性的,它不需要用ldt來儲存私有段資訊,因此,當系統切換到這種任務時,會將ldtr暫存器賦值成乙個空(全域性描述符)選擇子,選擇子的描述符索引值為0,ti指示位為0,rpl可以為任意值,用這種方式表明當前任務沒有ldt。

這裡的空選擇子因為ti為0,所以它實際上指向了gdt的第0項描述符,第0項的作用類似於c語言中null的用法,它雖然是乙個描述符,但卻只起到到了標誌的作用。規定gdt的第0項描述符為空描述符,其8個位元組全為0,就是這個原因。

如果把前面的空描述符選擇子的ti位改為1,使之指向ldt中的0號描述符,這樣的選擇子就不是空選擇子,它指向的ldt中的0號描述符是可以正常使用的,也就是ldt中沒有空描述符一說。

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的第0項總是乙個空描述符

用於當乙個任務使用的所有段都是系統全域性段時。gdtr 48 位 用於描述 gdt的基址和界限 ldtr 16 位 用於描述當前任務的 ldt在 gdt中的選擇子。如果乙個任務沒有 ldt,就會把 ldtr 清空,此時指向 gdt中的第 0項描述符,即為空描述符。lesson4 為什麼全域性描述符表...