80x86的保護模式
阿新 • • 發佈:2018-03-22
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的保護模式