歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> X86控制寄存器和系統地址寄存器+實模式和保護模式

X86控制寄存器和系統地址寄存器+實模式和保護模式

日期:2017/3/1 9:50:09   编辑:Linux編程
80386控制寄存器和系統地址寄存器如下表所示。它們用於控制工作方式,控制分段管理機制及分頁管理機制的實施。

控制
寄存器

CRx

BIT31

BIT30—BIT12

BIT11—BIT5

BIT4

BIT3

BIT2

BIT1

BIT0

CR0

PG

0000000000000000

ET

TS

EM

MP

PE

CR1

保留

CR2

頁故障線性地址

CR3

頁目錄表物理頁碼

000000000000


BIT47—BIT16

BIT15—BIT0

全局描述符表寄存器GDTR

基地址

界限

中斷描述符表寄存器IDTR

基地址

界限


BIT15—BIT0

局部描述符表寄存器LDTR

選擇子

任務狀態段寄存器TR

選擇子


BIT31—BIT0

BIT31—BIT0

BIT11—BIT0

基地址

界限

屬性

基地址

界限

屬性

一、控制寄存器

從上表可見,80386有四個32位的控制寄存器,分別命名為CR0、CR1、CR2和CR3。但CR1被保留,供今後開發的處理器使用,在80386中不能使用CR1,否則會引起無效指令操作異常。CR0包括指示處理器工作方式的控制位,包含啟用和禁止分頁管理機制的控制位,包含控制浮點協處理器操作的控制位。CR2及CR3由分頁管理機制使用。CR0中的位5—位30及CR3中的位0至位11是保留位,這些位不能是隨意值,必須為0。 控制寄存器CR0的低16位等同於80286的機器狀態字MSW。

1.保護控制位

控制寄存器CR0中的位0用PE(Protection Enable)標記,位31用PG(Paging)標記,這兩個位控制分段和分頁管理機制的操作,所以把它們稱為保護控制位。PE控制分段管理機制。PE=0,處理器運行於實模式;PE=1,處理器運行於保護方式。PG控制分頁管理機制。PG=0,禁用分頁管理機制,此時分段管理機制產生的線性地址直接作為物理地址使用;PG=1,啟用分頁管理機制,此時線性地址經分頁管理機制轉換位物理地址。關於分頁管理機制的具體介紹在後面的文章中進行。

下表列出了通過使用PE和PG位選擇的處理器工作方式。由於只有在保護方式下才可啟用分頁機制,所以盡管兩個位分別為0和1共可以有四種組合,但只有三種組合方式有效。PE=0且PG=1是無效組合,因此,用PG為1且PE為0的值裝入CR0寄存器將引起通用保護異常。

需要注意的是,PG位的改變將使系統啟用或禁用分頁機制,因而只有當所執行的程序的代碼和至少有一部分數據在線性地址空間和物理地址空間具有相同的地址的情況下,才能改變PG位。

PG和PE
位與處
理器工
作模式

PG

PE

處理器工作方式

0

0

實模式

0

1

保護模式,禁用分頁機制

1

0

非法組合

1

1

保護方式,啟用分頁機制


2.協處理器控制位

控制寄存器CR0中的位1—位4分別標記為MP(Math Present---算術存在位)、EM(Emulation---模擬位)、TS(Task Switch---任務切換位) 和ET(Extertion Type---擴展類型位),它們控制浮點協處理器的操作。

當處理器復位時,ET位被初始化,以指示系統中數字協處理器的類型。如果系統中存在 80387協處理器,那麼ET位置1;如果系統中存在80287協處理器或者不存在協處理器,那麼ET位清0。

EM位控制浮點指令的執行是用軟件模擬,還是由硬件執行。EM=0時,硬件控制浮點指令傳送到協處理器;EM=1時,浮點指令由軟件模擬。

TS位用於加快任務的切換,通過在必要時才進行協處理器切換的方法實現這一目的。每當進行任務切換時,處理器把TS置1。TS=1時,浮點指令將產生設備不可用(DNA)異常。 MP位控制WAIT指令在TS=1時,是否產生DNA異常。MP=1和TS=1時,WAIT產生異常;MP=0時,WAIT指令忽略TS條件,不產生異常。

3.CR2和CR3

控制寄存器CR2和CR3由分頁管理機制使用。

CR2用於發生頁異常時報告出錯信息。當發生頁異常時,處理器把引起頁異常的線性地址保存在CR2中。操作系統中的頁異常處理程序可以檢查CR2的內容,從而查出線性地址空間中的哪一頁引起本次異常。

CR3用於保存頁目錄表的起始物理地址。由於目錄是頁對齊的,所以僅高20位有效,低12 位保留未用。向CR3中裝入一個新值時,低12位必須為0;但從CR3中取值時,低12位被忽略。每當用MOV指令重置CR3的值時,會導致分頁機制高速緩沖區的內容無效,用此方法,可以在啟用分頁機制之前,即把PG位置1之前,預先刷新分頁機制的高速緩存。CR3寄存器即使在CR0寄存器的PG位或PE位為0時也可裝入,如在實模式下也可設置CR3,以便進行分頁機制的初始化。在任務切換時,CR3要被改變,但是如果新任務中CR3的值與原任務中CR3的值相同,那麼處理器不刷新分頁高速緩存,以便當任務共享也表時有較快的執行速度。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-12/93635p2.htm
Copyright © Linux教程網 All Rights Reserved