保护模式及其编程——8086系统寄存器和系统指令
生活随笔
收集整理的這篇文章主要介紹了
保护模式及其编程——8086系统寄存器和系统指令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要:為了協助處理器完成初始化和控制系統操作,<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">80x86</span></span>提供了一個標志寄存器和幾個系統寄存器。<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">Eflags</span></span>用于控制任務切換、中斷處理、指令跟蹤和權限訪問。系統寄存器用于內存管理和控制處理器操作。<h1><a target=_blank name="t0"></a><span style="font-size:18px;color:#ff0000;"><span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">1.</span></span>標志寄存器</span></h1>
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">32b,</span></span>含有系統標志和通用標志,以及保留位等等,具體可以參考相關資料,下面簡介系統標志位
<img src="https://img-blog.csdn.net/20140218234128812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJvY2hpbHVzZXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">1) TF:b8,</span></span>跟蹤標志
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">2</span></span>)<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">IOPL</span></span>:<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">b13-b12</span></span>,<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">IO</span></span>特權級
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">3</span></span>)<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">NT</span></span>:<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">b14</span></span>,嵌套任務標志(<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">nested task</span></span>)
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">4</span></span>)<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">RF</span></span>:<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">b16</span></span>,恢復標志(<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">resume flag</span></span>)
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">5</span></span>)<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">VM</span></span>:<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">b17</span></span>,虛擬<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">8086</span></span>模式<h1><a target=_blank name="t1"></a><span style="font-size:18px;color:#ff0000;"><span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">2.</span></span>內存管理寄存器</span></h1>
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">GDTR</span></span>、<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>、<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">IDTR</span></span>、<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">TR,</span></span>用于制定內存分段管理所用的系統表的基地址,其中<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">TR</span></span>用于尋址一個特殊的任務狀態段,<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">TSS</span></span>中包含中當前執行任務的重要信息。圖<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">1 </span></span>內存管理寄存器<img src="https://img-blog.csdn.net/20140218233752125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJvY2hpbHVzZXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">GDTR</span></span>:全局描述符表寄存器
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">IDTR</span></span>:中斷描述符表寄存器,使用<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LIDT&&SIDT</span></span>存取
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>:存放<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">32</span></span>位線性地址、<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">16</span></span>位限長和描述符屬性。指令<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LLDT</span></span>和<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">SLDT</span></span>用于保存<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>寄存器的段描述符部分。當使用<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>指令把含有<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDT</span></span>標段的選擇符加載進<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>時,對應段基地址、限長、屬性自動加載到<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>中。
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">TR</span></span>:任務寄存器,通用<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDR</span></span>和<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">STR</span></span>存取,存取操作類似<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">LDTR</span></span>。<h1><a target=_blank name="t2"></a><span style="font-size:18px;color:#ff0000;"><span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">3.</span></span>控制寄存器</span></h1>
用于控制和確定處理器的操作模式和當前執行任務的特性。
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">cr0</span></span>:控制處理器操作模式和狀態
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">cr1</span></span>:保留
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">cr2</span></span>:含有導致頁錯誤的線性地址
<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">cr3</span></span>:頁目錄表物理內存基地址<h2><a target=_blank name="t3"></a><span style="font-size:18px;color:#ff0000;"><span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">3.1 cr0</span></span>中的保護控制位</span></h2><span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">從某種程度長說,cr0是分段機制和分頁機制中最重要的寄存器:</span></span><span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">對于分段機制:cr0</span></span>中最重要的是<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">PE</span></span>(<span style="font-family:DejaVu Sans Mono,monospace;"><span lang="en-US">b0</span></span>)改變的時候需要特別小心。<span style="font-family:Arial,Helvetica,sans-serif;">修改了</span><span style="font-family:'DejaVu Sans Mono',monospace;"><span lang="en-US">PE</span></span><span style="font-family:Arial,Helvetica,sans-serif;">之后,必須立即使用一條跳轉指令,以刷新處理器執行管道中已經獲得的不同模式下的任何指令。在設置</span><span style="font-family:'DejaVu Sans Mono',monospace;"><span lang="en-US">PE</span></span><span style="font-family:Arial,Helvetica,sans-serif;">位之前,程序必須初始化基本系統段和控制寄存器。</span><span style="font-family:Arial,Helvetica,sans-serif;">
</span><pre name="code" class="cjk">對于分段機制<span style="font-family:'DejaVu Sans Mono',monospace;"><span lang="en-US">PG</span></span>(<span style="font-family:'DejaVu Sans Mono',monospace;"><span lang="en-US">b31</span></span>)位,<span style="font-family:Arial,Helvetica,sans-serif;">只有當執行程序至少有部分代碼和數據在線性地址空間和物理地址空間中有相同地址的時候,才能改變</span><span style="font-family:'DejaVu Sans Mono',monospace;"><span lang="en-US">PG</span></span><span style="font-family:Arial,Helvetica,sans-serif;">。所以,這一部分代碼在分頁和沒有分頁的世界之間起到了橋梁作用。開啟分頁之前,必須先栓新</span><span style="font-family:'DejaVu Sans Mono',monospace;"><span lang="en-US">TLB</span></span><span style="font-family:Arial,Helvetica,sans-serif;">。 </span><span style="font-family:Arial,Helvetica,sans-serif;">
</span><span style="font-family:Arial,Helvetica,sans-serif;">開啟的時候,必須先開啟分段,然后開啟分頁。</span><span style="font-family:Arial,Helvetica,sans-serif;">
</span><span style="font-family:Arial,Helvetica,sans-serif;">關閉的時候,要使用相反的順序,不然,就會出現如下的提示信息:check_CR0(0xe0000010): attempt to set CR0.PG with CR0.PE cleared?</span>
3.2 cr2和cr3
cr2和cr3用于分頁機制,cr3也被稱為PDBR。因為頁目錄表頁面是頁對齊的,所以該寄存器只有高20b有效(4k占用12b),低12b保留給更高級處理器使用。往cr3加載一個值的時候,低12b必須是0.使用mov指令加載cr3,會讓TLB失效。總結
以上是生活随笔為你收集整理的保护模式及其编程——8086系统寄存器和系统指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内核初始化kernel.asm
- 下一篇: 80486保护模式存储管理