8086中的32位保护模式(一)

概述

系统中的各种寄存器

  1. 标志寄存器EFALGS:控制I/O、可屏蔽中断、调试、任务切换以及保护模式和多任务环境下虚拟8086程序的执行等。全部标志都是保存在标志寄存器中;
  2. 内存管理寄存器,用于分段内存管理
    1. GDTR:全局描述符表寄存器,指向段描述符表GDT
    2. LDTR:局部描述符表寄存器,指向段描述符表LDT
    3. IDTR:中断描述符表寄存器,指向中断处理向量(句柄)表IDT的入口点,所有中断处理过程的入口地址信息均存放在IDT中
    4. TR:任务寄存器,指向处理器定义当前任务(进程)所需的信息,也即任务数据结构
  3. 控制寄存器,共有4个
    1. CR0含有系统整体的控制标志,如保护模式开启位、协处理器存在标志、任务切换等
    2. CR2,CPU将引起错误的线性地址保存在该寄存器中;
    3. CR3为CPU指定当前运行的任务所使用的页表目录
    4. CR1保留

内存管理

内存管理主要涉及处理器的内存寻址机制,分段形式逻辑地址转换为实际物理内存地址需经两步:

  1. 段变换,将一个由段选择符和段内偏移构成的逻辑地址转换为一个线性地址;
  2. 页变换,将线性地址转换为对应的物理地址

段变换

32位的逻辑地址变换成线性地址的过程:

  1. 首先,根据逻辑地址的0-15位(也称为选择符),到描述符表中定位到对应的段描述符(也就是描述符表中的一项)
  2. 将段描述符作为基址(32位),与原来的32位逻辑地址(这时候看成是偏移值)相加,从而得到线性地址

段描述符

  1. 向CPU提供了将逻辑地址映射为线性地址所必要的信息,一般有两种形式(用于程序代码段和数据段的描述符和用于特殊系统段的描述符),但是具体相差不是很大。各个字段的含义如下(一个段描述符为8字节):
  2. 基地址:定义段在4GB线性空间中的位置,共32位(由三个部分组成)
  3. 段限长:定义了段的最大长度
  4. 颗粒度
  5. 类型:用于区分各种不同类型的描述符
  6. 描述符特权级:用于保护机制,共有4级:0-3,0是最高特权
  7. 段存在位:表示该段描述符是否有效
  8. 访问位

描述符表

  1. 描述符表由段描述符构成,分为GDT和LDT两类
  2. CPU通过GDTR和LDTR寄存器来定位GDT表和当前的LDT表,保存了描述符表的基地址(32位)和表的长度
  3. 指令lgdt和sgdt用于访问GDTR寄存器;指令lldt和sldt用于访问 LDTR寄存器

选择符

  1. 逻辑地址的15-0位(共16位)即是选择符部分,用于在描述符表中指定描述符。各字段含义如下 :
  2. 索引值(第15-3位):用于选择指定描述符表中8192(213)个描述符中的一个描述符,步骤为:先乘上8(描述符的字节长度)可看作偏移地址,再加上描述符表的基地址就得到了段描述符的实际物理地址
  3. 表指示器(第2位), 0表示GDT表,1表示IDT表
  4. 请求者的特权级(第1-0位):用于保护机制

段寄存器

  1. CPU将描述符中的信息保存在段寄存器中(避免在每次访问内存时查询描述符表),其中每个段寄存器都有一个可见部分(16位)和一个不可见部分(8字节)
  2. 普通的程序指令,即直接加载指令(如MOV,POP,LDS,LSS,LGS,LFS,显式调用段寄存器)和隐式加载指令(如CALL和JMP),使用的都是可见部分
  3. 程序将16位的选择符加载到段寄存器的可见部分,CPU自动将对应的描述符的信息保存到不可见部分
  4. 段寄存器包括:CS代码段,SS堆栈段,DS数据段,ES附加段,FS,GS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值