80x86系統寄存器以及系統指令(個人理解)

 

  1. 80x86 系統寄存器和系統指令
    1. 爲了協助處理器執行初始化和控制系統操作,80x86 提供了一個標誌寄存器EFLAGS和幾個系統寄存器,除了一些通用狀態標誌外,EFLAGS 中還包含幾個系統標誌。 這些系統標誌用於控制任務切換,中斷處理,指令跟蹤以及訪問權限。 系統寄存器用於內存管理和控制處理器操作, 含有分段和分頁處理機制系統表的基地址,控制處理器的比較比特標誌位。
      1. 標誌寄存器:    ELFAGS 中的系統標誌和 IOPL字段用於控制I/O 訪問, 可屏蔽硬件中斷,調試,任務切換以及虛擬-8086 模式,如圖4-1所示。 通常只允許操作系統代碼有權修改這些標誌。EFLAGS 中的其他標誌是一些通用標誌(進位CF,奇偶PF,輔助進位AF,零標誌ZF, 負號SF, 方向DF,溢出 OF)。這裏僅僅對EFLAGS 的系統標誌進行說明。 
        1. TF : bit 8是跟蹤標誌(Trap Flag). 當設置該位時可爲調試操作啓動單步執行方式; 復位時則禁止單步執行。在單步執行方式下,處理器會在每個指令執行之後產生一個調式異常,這樣我們就可以觀察執行程序在執行每條指令後的狀態。如果程序使用了POPF,POPFD 或者IRET指令設置了TF 標誌,那麼在隨後指令之後處理器就會產生一個調試異常。
        2. IOPL : bit 13-12 是I/O 特權級(I/O Privilege Level)字段。該字段指明當前運行程序或任務的I/O特權級IOPL。當前運行程序或任務的CPL 必須小於等於 這個IOPL才能訪問I/O地址空間。 只有當CPL爲特權級0時,程序纔可以使用POPF 或IRET 指令修改這個字段。 IOPL也是控制對IF 標誌修改的機制之一。
        3. NT bit 14 是嵌套任務標誌(Nested Task)。 它控制着唄終端任務和調用任務之間的鏈接關係。在使用CALL 指令, 中斷或 異常執行任務調用時候,CPU 會設置該flag。 在通過使用IRET 指令從一個任務返回時候,CPU 會檢查並修改這個NT flag。 使用POPF/ POPFD 指令也可以修改這個標誌,但是在應用程序中改變這個flag的狀態會產生不可意料的異常。
        4. RF :bit 16是恢復標誌(Resume Flag)。 該flag 用於控制CPU 對斷點指令的響應。當設置時,這個flag 會臨時禁止斷點指令產生的調式異常: 當該flag 復位時候,則斷點指令講會產生異常。RF 標誌的蛀牙功能是運行在調式異常之後重新執行一條指令。當調試團結使用IRETD 指令返回被中斷程序之前,需要設置堆棧上EFLAGS 內存中的RF flag,以防止指令斷點造成另一個異常。CPU 會在返回之後自動地清除該flag, 從而再次允許指令斷點異常。
        5. VM : bit 17是虛擬-8086 方式(Virtual 8086 Mode)標誌。當設置該標誌時,就開啓虛擬-8086方式: 當復位該標誌時,則回到 保護模式。
    2. 內存管理寄存器
      1. CPU 提供了4個內存管理寄存器(GDTR,LDTR,IDTR 和 TR),用於指定分段內存管理所使用的系統表的基地址,見面圖4-2所示。 CPU爲這些寄存器的加載和保存提供了特定的指令。
      2.  GDTR,LDTR,IDTR, TR 都是段基址寄存器,這些段中含有分段機制的重要信息表。GDTR,IDTR和LDTR 用於尋址存放描述符表的段。TR 用於尋址一個特殊的任務狀態段TSS (Task State Segment)。 TSS 段包含着當前執行任務的重要信息。
      3. 全局描述表寄存器 GDTR : 用於存放全局描述符表GDT 的32 bit 線性基地址 和 16 bit 表長度值。基地址指定 GDT 表中字節 0 在線性地址空間中的地址,表長度指明GDT 表的字節長度值。 指令LGDT 和SGDT 分別用於加載和保存GDTR 寄存器的內容。 在機器剛加電或CPU復位後,基地址被默認的設置爲0,而長度值被設置成0xFFFF. 在保護模式初始化過程必須給GDTR加載一個新值。
      4. 中斷描述符表寄存器IDTR : 與GDTR的 作用類似,IDTR 寄存器用於存放中斷描述表IDT 的32 bit 線性基地址 和 16bit 表長度值。指令LIDT 和 SIDT 分別用於加載和保存IDTR 寄存器的內容。 在機器剛加電或CPU復位後, 基地址被默認的設置爲0,而長度值設置爲 0xFFFF。
      5. 局部描述符寄存器LDTR : 用於存放局部描述表LDT 的32 bit 線性基地址。 16 bit 段限長和描述符屬性值。 指令LLDT 和SLDT 分別用於加載和保存LDTR 寄存器的段描述符部分。包含LDT 表的段必須在GDT 表中有一個段描述符項。 當使用LLDT 指令把還有LDT 表段的選擇符加載進LDTR 時, LDT 段描述符的段基地址,段限長度以及描述符屬性會被自動地加載到LDTR中,當進行任務切換時候,段選擇符 和基地址被默認地設置爲0 ,而長度被設置爲0xffff。
      6. 任務寄存器TR : 用於存放當前任務TSS段的16 bit 段選擇符,32 bit 基地址, 16bit 段長度和描述符屬性值。它引用GDT 表中的一個TSS 類型的描述符。 指令LTR 和STR 分別用於加載和保存TR 寄存器的段選擇符部分。 當使用LTR指令把選擇符加載進任務寄存器時候,TSS 描述符中的段基地址,段限長度以及描述符屬性會被自動地加載到任務寄存器中。當執行任務切換時,處理器會把新任務TSS的段選擇符合段描述符自動地加載進任務寄存器TR 中。
    3. 控制寄存器 
      1. 控制寄存器(CR0, CR1, CR2 和 CR3)用於控制和確定處理器的操作模式以及當前執行任務的特性,見圖4-3所示。 CR0 中含有控制處理器操作模式和狀態的系統控制狀態: CR1 保留不用;  CR2 含有導致頁錯題的線性地址。 CR3 中含有頁目標表物理內存基地址,因此該寄存器頁被稱爲頁目錄基地址寄存器PDBR (Page Directory Base address Register)。
      2. CR0 中協處理器控制位 : CR0 的 4個bit : 擴展類型bit ET , 任務切換bit TS , 仿真bit EM 和數學存在bit MP 用於控制80x86 浮點(數學)協處理器的操作。 有關協處理器的詳細說明請參見其他資料內容。 CR0 的ET bit (標誌)用於選擇與協處理器進行通信所使用的協議,即指明系統中使用的是80387 還是 80287 協處理器。 TS,MP 和EM bit 用於確定浮點指令或 WAIT 指令是否應該產生一個設備部存在DNA (Device Not Available) 異常。這個異常可以用來僅僅爲使用浮點運算的任務保存和恢復浮點寄存器。對於沒有使用浮點運算的任務,這樣做 可以加快它們之間的切換操作。
        1. ET : CR0 的bit 4是擴展類型(Extension Type) 標誌。當該標誌位1時, 表示指明系統用 80387 協處理器存在,並使用32bit 協處理器協議。 ET =0 指明使用80287 協處理器。 如果仿真位 EM =1, 則該位將被忽略。 在處理器復位操作時,ET bit 會被初始化指明系統中使用的協處理器類型。 如果系統有有80387 ,則ET 被設置爲 1,否則如果有一個80287 或沒有協處理器,則ET 被設置爲0.
        2. TS :CR0 的bit 3 是任務已切換(Task Switched) 標誌。 該標誌用於推遲保存任務切換時的協處理器內容,直到新任務開始實際執行協處理器指令。處理器在每次任務切換時都會設置該標誌,並且在執行協處理器指令時測試該flag。如果這是了TS 標誌並且CR0 的EM 標誌位 0, 那麼在執行任何協處理器指令之前會產生一個設備不存在DNA (Device Not Available)異常。 如果設置了TS 但沒有設置CR0 的MP 和EM 標誌,呢麼在執行協處理器指令 WAIT /FWAIT 之前不會產生設備不存在異常。如果設置了EM 標誌,那麼TS 標誌對協處理器指令的執行無影響,見表4-1
        3. EM : CR0 的bit 2是仿真標誌(EMulation)。 當該bit 設置時候,表示處理器沒有內部或外部協處理器,執行協處理器指令時會引起設備不存在異常; 當清除時,表示系統有協處理器。設置這個flag 可以迫使所有浮點指令使用軟件來模擬。
        4. MP : CR0 的bit 1是監控協處理器標誌(Monitor )。用於控制WAIT /FWAIT 指令與TS標誌的交互作用。 如果MP=1、TS =1,那麼只需WAIT 指令將產生一個設備不存在異常; 如果MP =0, 則TS 標誌不會影響WAIT 的執行。
      3.  CR0 中保護控制bit
        1. PE : CR0 的bit 0 是啓用保護(Protection Enable)標誌。當設置該bit時即開啓了保護模式: 當復位時即進入了實模式。這個標誌僅僅開啓段級保護,而並沒有啓用分頁機制。如果要啓用分頁機制,那麼PE 和PG標誌都要置位。
        2. PG : CR0 的bit 32 是分頁(Paging)標誌。當設置該位時即開啓了分頁機制; 當復位時則禁止分頁機制,此時所有線性地址等同於物理地址。 在開啓這個標誌之前必須已經或者同時開啓PE 標誌。即若要啓用分頁機制,那麼PE 和PG 標誌都要置位。
        3. WP :對於Intel 80486或者以上的CPU, CR0 的位 16 是寫保護(Write Protect)標誌。當設置該標誌時,處理器會禁止超級用戶程序(例如特權級 0 -》R0 的程序)向用戶級只讀頁面執行寫操作;當該位復位時則反之。該標誌有利於UNIX 類操作系統在創建進程時實現寫時複製(Copy on Write) 技術。
        4. NE : 對於Intel 80486 或以上的CPU, CR0 的bit 5 是協處理器錯誤(Numerical Error)標誌。當設置該標誌時,就啓用了 x87 協處理器錯誤的內部報告機制;若復位該標誌,那麼久使用PC 機形式的x87 協處理器錯誤報告機制。
        5. 啓動保護模式 PE (0 bit) 和開啓分頁PG(bit 31)分別用於控制分段和分頁機制。 PE用於控制分段機制。 如果PE =1,處理器就工作在開啓分段機制環境下, 即運行在保護模式;                                                     如果PE =0,則處理器關閉了分段機制,並如果8086 工作與實模式下。 PG 用於控制分頁機制。 如果PG =1,則開啓了分頁機制。 如果PG =0,分頁機制被禁止,此時線性被直接作爲物理地址使用;                                           如果PE=0,PG=0 ,處理器工作在實地址模式下;    如果PG=0,PE=1,處理器工作在沒有開啓分頁機制的保護模式下;   如果PG=1,PE=0.此時由於不在保護模式下不能啓用分頁機制,因此處理器會產生一個一般保護異常,即這種標誌組合無效; 如果PG=1, PE =1,則處理器工作在開啓了分頁機制的保護模式下。         當改變PE 和PG bit 時嗎我們必須小心。只有當執行程序起碼有部分代碼和數據在線性地址空間和物理地址中具有相同地址時,我們才能改變PG bit的設置。此時這部分具有相同地址的代碼在分頁和未分頁世界之間起着橋樑的作用。無論是否開啓分頁機制,這部分代碼都具有相同的地址 。另外,在開啓分頁(PG=1) 之前必須先舒心CPU 中的頁高速緩衝(或稱爲轉換查找緩衝區 TLB - translation Lookaside Buffers)。    在修改了PE 位之後程序必須要立刻使用一條跳轉指令,以刷新處理器執行管道中已經獲取的不同模式下的任何指令。在設置PE bit 之前,程序必須初始化幾個系統段和控制寄存器。在系統剛上電時,處理器 被複位成 PE =0 , PG = 0(即實模式狀態),以允許引導代碼在啓用分段和分頁機制之前能夠初始化這些寄存器和數據結構。
      4. CR 2 和 CR3 : CR2 和CR3 用於分頁機制。 CR3 含有存放頁目錄表頁面的物理地址,因此CR3 也被稱爲PDBR。 因爲頁目錄頁面是頁對齊的,所以該寄存器只有高20 bit 是有效的。而低12bit 保留提供給更高級處理器使用,因此在往CR3 中加載一個新值時低 12 bit 必須設置爲 0.  使用MOV 指令加載CR3 時具有讓頁告訴緩衝無效的副作用。爲了減少地址轉換所要求的總線週期數量,最近訪問的頁目錄和頁表會被存放在處理器的頁高速緩衝器件中,該緩衝器被稱爲轉換查找緩衝區TLB (Translation Lookside Buffer)。只有當TLB 中不包含要求的頁表項時纔會使用額外的總線週期從內存中讀取頁表項。 即使CR0 中的PG 位於復位狀態 (PG =0),我們也能先加載CR3. 以允許對分頁機制進行初始化。當切換任務時,CR3 的內容也會隨之改變。 但是如果新任務的CR3 值與原任務的一樣,處理器就無需刷新高速緩衝。這樣共享頁表的任務可以執行得更快。     CR2 用於出現頁異常報告出錯信息。在報告異常時,處理器會把引起異常的線性地址存放在CR2 中。因此操作系統中的頁異常處理程序可以通過檢查CR2 的內容來確定線性地址空間中的哪一個頁面引發了異常。
    4. 系統指令: 系統指令用於處理系統級別功能,例如加載系統寄存器,管理中斷等。大多數系統指令只能由處於特權級0的操作系統軟件執行,其餘一些指令可以在任何特權級上執行,因此應用程序也能使用,表4-2 中列出了我們將用到的一些系統指令,其中還指出了它們是否受到保護。

發佈了198 篇原創文章 · 獲贊 36 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章