[OS_0x01]实模式 --> 保护模式(段式-->段页式)

“本文的一些截图来自于<IntelDEV卷3>和<x86汇编从实模式到保护模式>`

最近复习一些操作系统的知识,首先遇到了个坑便是计算机寻址问题.
本文是一些偏理论的东西(汇编可能在工作中用不到,需要的时候再深入研究吧- -!)

本文参考的一些博客和书本:

<a href=http://blog.csdn.net/trochiluses/article/details/8954527>[实模式与保护模式解惑之(一)——二者的起源与区别]</a>
汇编相关-从汇编研究局部变量机制
我看保护模式
x86汇编语言:从实模式到保护模式

实模式

  • 是什么

INTEL 8086CPU的寻址方式.

具体利用分段机制访问内存,访问时给出一个段基地址和一个段内偏移;(如DS:AX,其中DS和AX在这里的字长为16),访问的地址为实实在在的物理地址.

  • 为什么

    一个原因是8086特点 – 数据总线16位(字长为16)、地址总线却有20位(准确地说是CPU的寻址能力需要被设计成20位).

    这样程序员在没有特殊机制的引入时,只能访存2^16 B = 64 KB的空间(16位字长),达不到产品经理的需求(20位地址空间 = 2^20 B = 1 MB

    于是,这里设计成了使用段基地址 + 段内偏移的方式: 物理地址 = 段基地址<<16 + 段内偏移
    有个小问题就是这种方式实际上可访问的空间大于1M,即最大可以访问到0xFFFF*16 + 0xFFFF = 0x10FFEF > 0xFFFFF,多出的这些地址将从0开始(即对1M取模).

  • 实模式的段的特点 –

    • 每个段基地址都是16的倍数;

    • 每个段的最小长度是16 Bytes,最大是64 KB;<———-更新: 段的大小从1B到64KB都可以.见wiki:

      《[OS_0x01]实模式 --> 保护模式(段式–>段页式)》” />    1. WIKIPEDIA.png</p></li><li><p>访问的每个地址都是实际的物理地址.</p></li></ul></li><li><p>遗留的问题</p></li></ul><p>系统程序与用户程序访问的地址共存于同一地址空间,并且一视同仁:</p><ul><li>没有权限保护(用户可以随意访问1M的全部内存地址空间)</li><li>不支持多任务.</li></ul><h2>保护模式</h2><p><em>保护模式之所以叫“保护模式”,因为他对多任务提供了保护,并加入了权限.</em><br /> <em>玛德我想起来了大二汇编时保护模式这一章跳过了因为期末不考沃日.</em></p><ul><li><p>是什么<br /> <code>80386</code>及后续系列CPU所资磁的内存寻址方式.</p></li><li><p>为什么<br /> 引入保护模式的目的有:</p><ul><li>保护 – 权限管理</li><li>多任务隔离</li><li>向下兼容 – …</li></ul></li><li><p>怎么做<br /> 这里简要介绍一下保护模式.</p><ul><li><p>寻址方式的改变:</p></li><li><p>实模式下 – 可以直接访问<code>段基地址(段寄存器16_bit)<<16 + 段内偏移</code>并做一些单字长操作(访存/赋值) .</p></li><li><p>保护模式下 –<br /> 先来点废话:<br /> 由于需要引入权限管理, 需要:<code>访存时指出当前执行指令的人有没有权限访问这个地址;</code><br /> 这句话至少包括了2点:</p><ul><li>当前指令的权限描述;</li><li>目标地址的权限描述.</li></ul><p>所以当前的解决方案已经呼之欲出了:需要一个数据结构来描述内存地址.</p></li></ul></li></ul><h2>保护模式下的寻址_part1段式(1MB –> 4GB 32Bit)</h2><ul><li><p>机器启动流程 – 一个PC启动时都会先进入实模式,接着由某指令转入保护模式.</p></li><li><p><code>段描述符表</code> – 是一堆段描述符的集合,有GDT和LDT.其中GDT是<code>全局描述符表Global Descriptor Table</code>,该表是为整个OS服务的,在进入保护模式之前定义好(由bootloader). LDT,相对应地,则是局部段描述表,是每个进程自己独有的?.</p><p>GDTR寄存器存放着GDT的地址.<br /> 理论上说GDT可以位于4GB中的任何一个位置,但因为需要从实模式转保护模式,所以一般只在1M以内的位置…<em>(参见<x86从实模式到保护模式>)</em></p><p> <img layer-src=Processon.com

    • Naive的页表:

      《[OS_0x01]实模式 --> 保护模式(段式–>段页式)》” />    Naive页表</li><li><p>分层次的页表:</p><p> <img layer-src=     原文作者:Quasars
          原文地址: https://www.jianshu.com/p/764dfd9d5cef
          本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

点赞