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

80x86的保護模式

logs 都是 alt pos 使用 itl 偏移 top 段描述符

什麽是保護模式?

通過對程序使用的存儲區采用分段、分頁的存儲管理機制, 達到分組使用、互不幹擾的保護目的。能為每個任務提供一臺虛擬處理器,使每個任務單獨執行,快速切換。

所以,內存地址由段基地址、偏移地址構成。

在內存中段怎麽描述?

段的描述符:段基地址(32位)、段長度(20位,單位為2^12,即4K)、訪問權限, 總計64位。

出於系統的兼容問題,段寄存器都是16位的, 那麽如何表示64位的段描述符呢?

通過描述符表:將段寄存器的高13位作為索引來訪問該表(描述符表本身也有一個基址,加上這13位的偏移地址), 從而獲得64位的段描述符。

描述符表分為兩類:

1. GDT是全局描述符表,主要存放操作系統和各任務公用的描述符, 也存放LDT描述符。

2. LDT是局部描述符表, 主主要存放各個任務的私有描述符。

段寄存器:高13位用來指示描述符在描述符表中的索引號, 低兩位是表示使用描述符的特權級別。另外一位(TI)是GDT和LDT的信號量,如果TI = 0, 則使用GDT, 如果 TI為1, 則使用LDT。

如何從GDT裏找到需要的描述符呢??

芯片上有一個GDT寄存器,是48位,存放著GDT的位置與長度, 對程序員是可見。

先從GDT寄存器中找到GDT的基址,然後從段寄存器中找到需要的描述符的索引值,這樣就找到了需要的描述符了。如下圖所示:

技術分享圖片

如何找到LDT上需要的描述符呢??

芯片上也有一個LDT寄存器, 是48位的,存放著LDT在GDT裏的索引值與。

先從GDT寄存器裏找到GDT的基址,再從LDT寄存器裏找到LDT的索引值,這樣就找到了LDT的描述符, 也就找到了LDT的基址了,然後從段寄存器裏找到需要的描述符的索引值 ,這樣就找到了需要的描述符了。如下圖所示:

技術分享圖片

80x86的保護模式