Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

实模式和保护模式

实模式

  • 特点

    • 20位分段内存
    • 不支持内存保护
    • 最早期8086 CPU的工作方式
      • 数据总线16位
        • 一次最多取2 ^ 16 = 64KB数据
        • 这也是每个段的极限大小
      • 地址总线20位
        • 刚好有2 ^ 20 = 1MB寻址空间
      • 所有寄存器都是16位
  • 【问题来了】16位寄存器,怎么做到地址总线20位?

  • 【答案】利用分段

    • 方法
      • 用另一个寄存器设置段基地址
      • 计算时自动左移4位(即取最高4位),跟偏移地址组合起来
    • 例子
      jmp f000:e05b
      
    • 算法
      (f000 << 4) + e05b = fe05b
      
    • 解释
      • 这里段基地址为f000 即1111 0000 0000 0000

      • 左移4位后得到f 0000 即1111 0000 0000 0000 0000

      • 低16位跟e05b相加即可

保护模式

  • 特点

    • 均升级为32位,最大4GB寻址空间
    • 支持内存保护
    • 从80826 CPU开始采用保护模式,但也向前兼容了实模式
  • 【问题来了】保护模式如何做到宣称的64TB虚拟地址空间?

  • 【答案】利用 段选择符 指向 段描述符,得到其中的32位的段基地址,然后跟偏移地址组合起来

    • 逻辑地址

      • 组成为:高16位段选择符 + 低32位段内偏移地址
    • 段选择符

      • 总长16位
      • 组成:13位索引 + 1位TI + 2位RPL
        • 索引:指向段描述符
        • TI
          • 0表示从GDT全局描述符表去找
          • 1表示从LDT局部描述符表去找
      • 每个表有2 ^ 13 = 8192个索引 (GDT+LDT两个表就是16384个)
      • 这样虚拟地址空间就是 16384 * 4GB = 64TB
    • 例子

      • jmpi 0, 8中的8就是段选择符
      • 8的二进制低4位表示为1000
      • 解释为1 0 00
      • 表示到GDT找第2个段描述符 (因为从0开始计数)
    • 段描述符

      • 总长64位,其中32位是段基地址
        • 后面拼接逻辑地址中的32位段内偏移地址,生成线性地址