zoukankan      html  css  js  c++  java
  • 80x86的保护模式

    什么是保护模式?

    通过对程序使用的存储区采用分段、分页的存储管理机制, 达到分组使用、互不干扰的保护目的。能为每个任务提供一台虚拟处理器,使每个任务单独执行,快速切换。

    所以,内存地址由段基地址、偏移地址构成。

    在内存中段怎么描述?

    段的描述符:段基地址(32位)、段长度(20位,单位为2^12,即4K)、访问权限, 总计64位。

    出于系统的兼容问题,段寄存器都是16位的, 那么如何表示64位的段描述符呢?

    通过描述符表:将段寄存器的高13位作为索引来访问该表(描述符表本身也有一个基址,加上这13位的偏移地址), 从而获得64位的段描述符。

    描述符表分为两类:

    1. GDT是全局描述符表,主要存放操作系统和各任务公用的描述符, 也存放LDT描述符。

    2. LDT是局部描述符表, 主主要存放各个任务的私有描述符。

    段寄存器:高13位用来指示描述符在描述符表中的索引号, 低两位是表示使用描述符的特权级别。另外一位(TI)是GDT和LDT的信号量,如果TI = 0, 则使用GDT, 如果 TI为1, 则使用LDT。

    如何从GDT里找到需要的描述符呢??

    芯片上有一个GDT寄存器,是48位,存放着GDT的位置与长度, 对程序员是可见。

    先从GDT寄存器中找到GDT的基址,然后从段寄存器中找到需要的描述符的索引值,这样就找到了需要的描述符了。如下图所示:

    image

    如何找到LDT上需要的描述符呢??

    芯片上也有一个LDT寄存器, 是48位的,存放着LDT在GDT里的索引值与。

    先从GDT寄存器里找到GDT的基址,再从LDT寄存器里找到LDT的索引值,这样就找到了LDT的描述符, 也就找到了LDT的基址了,然后从段寄存器里找到需要的描述符的索引值 ,这样就找到了需要的描述符了。如下图所示:

    image

  • 相关阅读:
    LG gram 双系统全指南
    离散数学读书记录
    研究小报告:掺杂硅脂对处理器散热能力的影响
    SICP 课程总结 & 复习
    maxHeap 的 python 实现
    KDD Cup 2018 冠军团队 思路分享
    mergeSort, quickSort, shellSort 的 python 实现
    数据集-搜集
    【NOIP2018模拟赛】
    【NOIP2018 模拟】
  • 原文地址:https://www.cnblogs.com/yinheyi/p/8620209.html
Copyright © 2011-2022 走看看