在進入保護模式以前,咱們先要學習一些基礎知識。今天咱們看一下全局描述符表(Global Descriptor Table, 簡稱GDT)。學習
同實模式同樣,在保護模式下,對內存的訪問仍然使用段地址加偏移地址。可是,在保護模式下,在每一個段可以訪問以前,必須先登記。這就比如像C語言中,「對變量的使用必須先定義」同樣。.net
每一個段在可以使用以前,都要爲這個段創建一個描述符。每一個描述符佔8個字節,這些描述符集中存放在內存的某個區域,一個挨着一個,就構成了一張「表」。blog
80x86中有兩種描述符表:ip
LDT咱們之後再說,今天的重點是GDT.內存
在進入保護模式以前,必需要定義GDT,也就是說,咱們要在內存中構建出一張表。get
須要說明的是:在整個系統中,全局描述符表GDT只有一張(一個處理器對應一個GDT);GDT能夠被放在內存的任何位置,但CPU必須知道GDT的入口。it
你也許會問:CPU如何知道GDT的入口呢?別擔憂,在處理器內部,有一個48位的寄存器,名叫GDTR,也就是全局描述符表寄存器。其結構以下圖:基礎
該寄存器分爲2部分:變量
注意:在處理器剛上電的時候,基地址默認爲0,表界限默認爲0xFFFF; 在保護模式初始化過程當中,必須給GDTR加載一個新值。分頁
由於表界限是16位的,最大值是0xFFFF,也就是十進制的65535,那麼表的大小就是65535+1=65536.又由於一個描述符佔用8個字節,因此65536字節至關於8192個描述符(65536/8=8192).故理論上最多能夠定義8192個描述符。實際上,不必定這麼多,具體多少根據須要而定。
理論上,GDT能夠放在內存中的任何地方。可是,咱們必須在進入保護模式以前就定義GDT(否則就來不及了),因此GDT通常都定義在1MB如下的內存範圍中。固然,容許在進入保護模式後換個位置從新定義GDT。