80x86 cpu的保護模式

2021-04-15 08:18:04 字數 3235 閱讀 8048

轉貼 80x86 cpu的保護模式

對於學習任何程式語言的朋友來說掌握cpu的操作模式都是一件非常重要的事,其中就數保護模式這部分最重要了,現在關於保護模式的中文資料就只有楊季文先生那一家還算全面,但有些人還是覺得看不太懂,為此我就寫了這篇文章,看看是否對您的胃口!

一、保護模式概述

顧名思義,就是對程式的執行加以保護。我們知道在實模式下通常只能定址1m的記憶體空間,且只能是單任務,就是說同一時間不能有兩個任務被啟用。從8086/8088的20根位址線,80286的24根位址線到80386的32根位址線,直至今天puntium4已經發展到了36根位址線,它們分別可以定址1m、16m、4g、64g的記憶體空間,然而在實模式下,通常的定址範圍還是1m。也就是對於在純dos下執行的puntium4也只能是乙個快速的8086。

前面已經說了,保護模式就是對程式的執行加以保護,所以說保護模式較實模式的增強的最主要體現還不是定址能力而是對多工的支援,所提到的保護就是對不同任務間和同一任務內的程式加以保護,使它們的執行不受對方「有意」或「無意」影響,但同時也要對兩個任務都要用到的部分**實現共享。另外乙個重要的增強就是對虛擬儲存器的支援,從一定意義上說可以使程式設計人員不必考慮物理記憶體的大小。

有了新的模式,當然要有大量的新增暫存器的支援,學習這些暫存器也是學習保護模式的關鍵.

三個重要的系統表gdt、ldt和idt

首先說明的是,這三個表是在記憶體中由作業系統或系統程式設計師所建,並不是固化在**,所以從理論上是可以被讀寫的。

這三個表都是描述符表.描述符表是由若干個描述符組成,每個描述符占用8個位元組的記憶體空間,每個描述符表內最多可以有8129個描述符.描述符是描述乙個段的大小,位址及各種狀態的.描述符表有三種,分別為全域性描述符表gdt、區域性描述符表ldt和中斷描述符表idt。

1.全域性描述符表gdt:

全域性描述符表在系統中只能有乙個,且可以被每乙個任務所共享.任何描述符都可以放在gdt中,但中斷門和陷阱門放在gdt中是不會起作用的.能被多個任務共享的記憶體區就是通過gdt完成的,

2.區域性描述符表ldt:

區域性描述符表在系統中可以有多個,通常情況下是與任務的數量保持對等,但任務可以沒有區域性描述符表.任務間不相干的部分也是通過ldt實現的.這裡涉及到位址對映的問題.和gdt一樣,中斷門和陷阱門放在ldt中是不會起作用的.

3.中斷描述符表idt:

和gdt一樣,中斷描述符表在系統最多只能有乙個,中斷描述符表內可以存放256個描述符,分別對應256個中斷.因為每個描述符占用8個位元組,所以idt的長度可達2k.中斷描述符表中可以有任務門、中斷門、陷阱門三個門描述符,其它的描述符在中斷描述符表中無意義。

段選擇子

在保護模式下,段暫存器的內容已不是段值,而稱其為選擇子.該選擇子指示描述符在上面這三個表中的位置,所以說選擇子即是索引值.

描述符前面已經提到,描述符是描述乙個段的大小,位址及各種狀態的8個位元組的結構,在程式設計時它可以定義它.

根據描述符所描述物件的不同,描述符可分為儲存段描述符、系統段描述符、門描述符三種,而門描述符又可分為呼叫門、任務門、中斷門和陷阱門四類。下面將分別介紹各描述符作用及其各位的意義:

一、儲存段描述符

儲存段描述符是描述程式中的**段和資料段的,這其中也包括堆疊段,在保護模式下,應該把堆疊段理解為特殊的資料段。

分析儲存段描述符時應該把它分成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

二、系統段描述符

系統段描述符是描述兩個特殊的段,它們分別為區域性描述符表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位為雙字計數字段,該字段是說是在發生特權級變換時,把外層堆疊中的引數拷貝到內層堆疊中的數量,計數以雙字為單位。 

80X86 保護模式

保護模式定義 保護 用硬體對每個任務使用的記憶體空間進行保護,阻 止其他任務的非法訪問。特點如下 a 採用虛擬儲存管理,啟用分段和分頁機制。允許關閉分頁機制 b 段內偏移位址 32位,每個段最大232 b 4gb 每個程式最多可以使用 16k個段,理論上的虛擬位址空間為 4gb 16k 64tb c...

80x86保護模式

請教 1 何為實位址方式?2 何為保護方式?3 二者的區別是什麼?能否詳細 4 什麼是虛擬位址?5 什麼是對映?6 何為浮點數?回答 如果你想詳細地搞清以上問題,建議你去閱讀有關386 486或pentium彙編的書 8086 8088的彙編的書一般沒有保護方式 虛擬位址 浮點數等概念 一般都會有專...

80x86的保護模式

通過對程式使用的儲存區採用分段 分頁的儲存管理機制,達到分組使用 互不干擾的保護目的。能為每個任務提供一台虛擬處理器,使每個任務單獨執行,快速切換。所以,記憶體位址由段基位址 偏移位址構成。描述符表分為兩類 1.gdt是全域性描述符表,主要存放作業系統和各任務公用的描述符,也存放ldt描述符。2.l...