1. 程式人生 > >操作系統學習(五) 、代碼段和數據段描述符

操作系統學習(五) 、代碼段和數據段描述符

數據段 轉移 異常類 格式 需要 狀態 管理 更新 不能

一、代碼段和數據段描述符格式

  • 段描述符通用格式如下所示:
    技術分享圖片

  • 代碼段和數據段描述符中各個位的含義如下所示:
    技術分享圖片
    技術分享圖片

二、代碼段和數據段描述符類型

當段描述符中S標誌位(描述符類型)被置位,則該描述符用於代碼段或數據段。此時類型字段中最高比特位(第二個雙字的位11)用於確定是數據段描述符(復位)還是代碼段描述符(置位)。

  • 代碼段和數據段描述符類型如下所示:
    技術分享圖片

  • 對於數據段描述符,類型字段的低3位(位8,9,10)分別用於表示已訪問A,可寫W,和擴展方向E,根據可寫比特位W的設置,一個數據段可以是只讀的,也可以是可讀可寫的。

  • 已訪問比特位指明從上次操作系統復位該位之後一個段是否被訪問過。每當處理器把一個段的段選擇符加載進段寄存器,它就會設置該位。該位需要明確地清除,否則一直保持置位狀態,該位可用於虛擬內存管理和調試。

  • 堆棧段必須是可讀可寫的數據段,若使用不可寫的數據段的段選擇符加載到SS寄存器,將導致一個一般保護異常。如果堆棧段的長度需要動態地改變,那麽堆棧段可以是一個向下擴展的數據段(擴展標誌位置位)。動態地該百年段限長將導致棧空間被添加到棧底部。

  • 對一代碼段,類型字段的第三位被解釋成已訪問A,可讀R,和一致的C。根據可讀R標誌的設置,代碼段可以是只能執行、可執行/可讀。當常數或其它靜態數據以及指令碼被放在了一個ROM中就可以使用一個可執行/可讀代碼段,這裏,通過使用帶CS前綴的指令或者把代碼段選擇符加載進一個數據段寄存器(DS,ES,FS或GS),我們可以讀取代碼段中的數據,在保護模式下,代碼段是不可寫的。

  • 代碼段可以是一致性的或非一致性的。向更高特權級一致性代碼段的執行控制轉移,允許程序以當前特權級繼續運行,向一個不同特權級的非一致性代碼段的轉移導致一般保護異常,除非使用了一個調用門或任務門。不訪問保護設施的系統工具以及某些異常類型的處理過程可以放在一致性代碼段中。需要防止低特權級程序或過程訪問的工具應該存放在非一致性代碼段中。

  • 所有的數據段都是非一致性的,即意味著它們不能被低特權級的程序或過程訪問,與代碼段不同,數據段可以被更高特權級的程序或過程訪問,而無需使用特殊的訪問門。

如果GDT或LDT中一個段描述符被存放在ROM中,那麽若軟件或處理器試圖更新在ROM中的段描述符時,處理器就會進入一個無限循環(why?),為了防止這個問題,需要存放在ROM中的所有描述符的已訪問位應該預先設置成置位狀態,同時,刪除操作系統中任何試圖修改ROM中段描述符的代碼。

操作系統學習(五) 、代碼段和數據段描述符