保护模式及其编程——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 cr2cr3

cr2cr3用于分页机制, cr3也被称为 PDBR。因为页目录表页面是页对齐的,所以该寄存器只有高 20b有效 (4k占用 12b),低 12b保留给更高级处理器使用。往 cr3加载一个值的时候,低 12b必须是 0.使用 mov指令加载 cr3,会让 TLB失效。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值