1. 程式人生 > >80x86 cpu的保護模式

80x86 cpu的保護模式

 一、儲存段描述符
 儲存段描述符是描述程式中的程式碼段和資料段的,這其中也包括堆疊段,在保護模式下,應該把堆疊段理解為特殊的資料段。
 分析儲存段描述符時應該把它分成4個域來理解:
第一個域為描述符的第0至1位元組,該字是段界線的低16位,段界線是描述段的大小共20位,高4位在第六位元組的低4位中;第二個域為描述符的第2至4位元組,這三個位元組是段基址的低24位;第三個域是描述符的第5、6位元組,該字存放的是段的一些屬性;第四個域是最後一個位元組,該位元組存放的是段基址的高8位。下面對屬性字的每一位進行描述:

 P位說明所描述的段是否存在,P=1表示描述符所描述的段存在於記憶體中,P=0表示描述符所描述的段不在記憶體中。
 DPL為描述符所描述段的特權級,只有有效特權級EPL大於等於DPL時,才能對段進行訪問。
 DT位必有為1以區別於系統段描述符。
 TYPE欄位:
 位0表示被描述的段是否被訪問過,該位為0表示未被訪問過,為1則表示該段先前已經被訪問過。
 位1的定義在於描述符所描述段的型別。當所描述的是程式碼段時,該位指示所描述的程式碼段是否可讀,為1則可讀,為0則不可讀;當所描述的是資料段時,該位指示所描述的資料段是否可寫,為1則可寫,為0則不可寫。
 位2的定義也在於描述符所描述段的型別。當所描述的是程式碼段時,該位指示所描述的程式碼段是否是一至程式碼段,為1表示該程式碼段是一至程式碼段,為0表示該程式碼段不是一至程式碼段,即是普通的程式碼段。當所描述的是資料段時,該位指示該段的擴充套件方向,為1時表示該段向低地址擴充套件,為0時表示該段向高地址擴充套件。
 位3指示所描述的段型別,為1表示所描述的段是程式碼段,是可以被執行的,為0表示所描述的段是資料段,是不能被執行的。前面已經說了,在保護模式下應該把堆疊段理解為特殊的資料段,為0時也包括堆疊段。
 G位表示段界限的計數單位,該位為0時表示段界限以位元組為單位,為1時表示以4K為單位。這樣計算下來,20位的段界限就可以描述大小為64K或4G的段了,
 D位說明描述符所描述的段是32位環境還是16位的環境。該決定了指令所使用的運算元以及地址的預設大小,為1時說明是32位地址和32位運算元,即32位段;為0時說明是16位地址和16位運算元,即是16位段。但這時仍可使用運算元及地址大小字首來改變這種預設設定。該位還決定了系統是使用IP還是EIP,使用SP還是ESP