保護模式知識(三) (轉)

worldblog發表於2007-12-14
保護模式知識(三) (轉)[@more@]

描述符
 前面已經提到,描述符是描述一個段的大小,地址及各種狀態的8個位元組的結構,在時它可以定義它.
 如圖2所示,根據描述符所描述的不同,描述符可分為段描述符、段描述符、門描述符三種,而門描述符又可分為門、任務門、中斷門和陷阱門四類。下面將分別介紹各描述符作用及其各位的意義:
 一、儲存段描述符
 儲存段描述符是描述中的程式碼段和資料段的,這其中也包括堆疊段,在保護下,應該把堆疊段理解為特殊的資料段。
 分析儲存段描述符時應該把它分成4個域來理解:
第一個域為描述符的第0至1位元組,該字是段界線的低16位,段界線是描述段的大小共20位,高4位在第六位元組的低4位中;第二個域為描述符的第2至4位元組,這三個位元組是段基址的低24位;第三個域是描述符的第5、6位元組,該字存放的是段的一些屬性;第四個域是最後一個位元組,該位元組存放的是段基址的高8位。下面對屬性字的每一位進行描述:
 如圖2所示:
 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,
 二、系統段描述符
 系統段描述符是描述兩個特殊的段,它們分別為區域性描述符表LDT段和任務狀態段TSS。
 從圖2中可見,系統段描述符與儲存段描述符的區別只在於DT位,DT=1則為儲存段描述符,DT=0則為系統段描述符,兩種描述符就靠此位區分.但系統段描述符的TYPE欄位與儲存段描述符的TYPE卻截然不同.描述如下:
 TYPE欄位:
 0、1兩位的定義取決於位2。當位2為1時,說明是門描述符,為0時說明是非門描述符。當位2為1時,0、1兩位確定門描述符的型別,因為兩位可有4種狀態,所以正好描述4個描述符,為0時則是呼叫門,為1時則是任務門,為2時則是中斷門,為3時則是陷阱門;當位2為0時,低兩位0位、1位為0時未定義,為1時則是可用的286的TSS,為2時則是LDT,為3時則是忙的286的TSS。
 位4為0時,如其它位也為0或低兩位為2或3時則也是未定義,否則該位提示是386還是286描述符,關於段基地址和段界限為何都安排在兩個分開的域中的原因也與此有關,請讀者自己想想!
 三、門描述符
 從系統段描述符的說明中可以看出門描述符是靠TYPE欄位與系統段描述符區分的,但從圖2中可見門描述符卻與系統段描述符在結構上也不一至,其實這才是區分二者關鍵。門描述符的第四位元組的低4位為雙字計數字段,該欄位是說是在發生特權級變換時,把外層堆疊中的引數複製到內層堆疊中的數量,計數以雙字為單位。關於特權級變換請參閱《保護模式下的特權級檢查》一文.
 

 


 (待續)
 
 
 
 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993263/,如需轉載,請註明出處,否則將追究法律責任。

相關文章