第2章 认识CPU-2.3 32位微处理器(2)

2.3.2 保护模式

80386提供了两种工作模式。其一为实模式,在此模式下,80386可以和8086、8088完全地兼容。其二为保护模式,它是80386提供的一种全新的强的工作模式。在保护模式下,不仅可寻址4GB的内存空间,扩充了内存的分段管理机制,并可对内存进行分页管理,而且还可实现虚拟内存,支持多任务。

保护模式最重要的是完善了多任务保护机制。其实在80286开始,就具备了保护工作方式,但当时还不是很完善,80386才得到真正的完善。有两种保护模式任务方式。

(1)不同任务之间的保护:通过把每个不同的任务放在不同的虚拟地址空间中,来实现不同任务间的隔离(即A程序不能访问和修改B程序的代码和数据),以达到程序间的隔离。

(2)同一任务的保护:在每一任务之内定义了4种保护级别。分别为0、1、2、3,按环的方式来表示。

其中,0级代表最高的权限级,3级代表最低的权限级。按环的方式来表示,数字小的在"内环",数字大的在外环。其中,环0、1、2为系统级,环3为用户级。原来的系统都是基于用户和系统来设计的,所以一般的系统只使用环0和环3这两个级。

2.3.3 80386的寻址方式

80386继续采用分段的方法管理主内存。内存的逻辑地址由段基地址(段的起始地址)和段内偏移两部分表示,存储单元的地址由段基地址加上段偏移得到。段寄存器指示段基地址,各种寻址方式决定段内偏移。

实模式下,段基地址仍然是16的倍数,段的最大长度仍然是64KB。段寄存器内所含的仍然是段基地址对应的段值,存储单元的物理地址仍然是段寄存器内的段值乘上16再加上偏移。所以,尽管386有32根地址线,可直接寻址物理地址空间达到4GB字节,但在实模式下,仍然与8086/8088相似。

在保护模式下,段基地址可长32位,并且无需是16的倍数,可以是内存内任意一个开始点,段的最大长度可达4GB。它的寻址就与8086/8088有很大的变化。

  1. 描述符

保护模式下的虚拟器由大小可变的存储块组成,这样的存储块还是称"段"。每个段由如下的三个参数进行定义:基地址、段界限、段属性。在保护下可以建立多个段。

这些描述符会放置在内存的某一块空间内。

  1. 选择子

在8086/8088和80386实模式下,段寄存器用来表示段值。而在80386的保护模式下,段寄存器就成为选择子。可以将选择子看做一个句柄。

选择子的作用就是指向对应的描述符。例如,代码选择子的值是02H(也就是CS=02H),那么它指向的就是02H个描述符。

  1. 简单的寻址过程

当在机器运行如下代码时:

MOV AX,DS:[DX];

假设此时DS=04H,DX=2344H,那么CPU怎样才能在内存中找DS:[DS]的值呢?其步骤如下:

(1)从DS选择子中选取04H。

(2)从对应的描述符空间中查找到第04H个描述符。

(3)取出描述符中的三个参数,分别是段基地址、段界限和段属性。假设段的基地址等于00012345H,段界限等于5678H。

(4)这时,段基地址就是段的开始位置,通过EIP的32位偏移,

就可得到物理地址,由:

物理地址=段基地址+偏移

可得物理地址就是179BDH(00012345H+5678H)。

(5)此时就可以从179BDH中取出数据放入AX寄存器中。

相关推荐
坚果派·白晓明4 分钟前
【鸿蒙PC三方库移植适配框架解读系列】第四篇:构建执行、产物获取与 HAP 集成
c语言·华为·harmonyos·鸿蒙·c/c++三方库
Cinema KI21 分钟前
Linux C/C++ 编译构建:GCC/G++ + Makefile 零基础完整教程
linux·c语言·c++
念恒1230639 分钟前
基础IO(文件缓冲区)
linux·c语言·c++
时空自由民.1 小时前
C/C++ volatile关键字原理及应用介绍
java·c语言·c++
枕星而眠2 小时前
栈(Stack)与队列(Queue)核心知识总结
c语言·数据结构·后端·链表
谙弆悕博士2 小时前
【附C语言源码】从零实现命令行贪吃蛇游戏
c语言·开发语言·学习·游戏·游戏程序·小游戏·贪吃蛇
念恒123063 小时前
基础IO(一切皆文件)
linux·c语言·c++·算法
Severus_black4 小时前
【初阶数据结构】C语言实现堆(Heap),巨详细!
c语言·数据结构
永远自我4 小时前
matlab对c语言模块进行仿真
c语言·开发语言
大志出奇迹5 小时前
传输协议为大端,STM32为小端,数据传输的字节序问题
c语言·stm32·单片机·mcu·算法·rtos