Intel 80386运行模式

news2024/11/23 19:19:08

Intel 80386运行模式

一般CPU只有一种运行模式,能够支持多个程序在各自独立的内存空间中并发执行,
且有用户特权级和内核特权级的区分,让一般应用不能破坏操作系统内核和执行特权指令。
80386处理器有四种运行模式:实模式、保护模式、SMM模式和虚拟8086模式。
这里对涉及ucore的实模式、保护模式做一个简要介绍。

实模式

这是个人计算机早期的8086处理器采用的一种简单运行模式,
当时微软的MS-DOS操作系统主要就是运行在8086的实模式下。
80386加电启动后处于实模式运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,
且无法发挥Intel 80386以上级别的32位CPU的4GB内存管理能力。
实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,
操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。
这样用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,
并修改了内容,那么其后果就很可能是灾难性的。

对于ucore其实没有必要涉及,这主要是Intel x86的向下兼容需求导致其一直存在。
其他一些CPU,比如ARM、MIPS等就没有实模式,
而是只有类似保护模式这样的CPU模式。

保护模式

保护模式的一个主要目标是确保应用程序无法对操作系统进行破坏。
实际上,80386就是通过在实模式下初始化控制寄存器(如GDTR,LDTR,IDTR与TR等管理寄存器)以及页表,
然后再通过设置CR0寄存器使其中的保护模式使能位置位,从而进入到80386的保护模式。
当80386工作在保护模式下的时候,其所有的32根地址线都可供寻址,物理寻址空间高达4GB。
在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。
保护模式下80386支持多任务,还支持优先级机制,不同的程序可以运行在不同的特权级上。
特权级一共分0~3四个级别,操作系统运行在最高的特权级0上,应用程序则运行在比较低的级别上;
配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。

Intel 80386内存架构

地址是访问内存空间的索引。
一般而言,内存地址有两个:
一个是CPU通过总线访问物理内存用到的物理地址,
一个是我们编写的应用程序所用到的逻辑地址(也有人称为虚拟地址)。
比如如下C代码片段:
int boo=1;//变量
int* foo = &a;//a的地址
这里的boo是一个整型变量,
foo变量是一个指向a的地址的整型指针变量,
foo中储存的内容就是a的逻辑地址。

80386是32位的处理器,即可以寻址的物理内存地址空间为2^32=4G字节。
为更好理解面向80386处理器的ucore操作系统,
需要用到三个地址空间的概念:
物理地址、
线性地址和
逻辑地址。

物理内存地址

物理内存地址空间是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。
一个计算机系统中只有一个物理地址空间.

线性地址空间

线性地址空间是80386处理器通过段(Segment)机制控制下的形成的地址空间。
在操作系统的管理下,每个运行的应用程序有相对独立的一个或多个内存空间段,
每个段有各自的起始地址和长度属性,
大小不固定,这样可让多个运行的应用程序之间相互隔离,实现对地址空间的保护。

在操作系统完成对80386处理器段机制的初始化和配置
(主要是需要操作系统通过特定的指令和操作建立全局描述符表,完成虚拟地址与线性地址的映射关系)后,
80386处理器的段管理功能单元负责把虚拟地址转换成线性地址,
在没有下面介绍的页机制启动的情况下,这个线性地址就是物理地址。

相对而言,段机制对大量应用程序分散地使用大内存的支持能力较弱。
所以Intel公司又加入了页机制,每个页的大小是固定的(一般为4KB),
也可完成对内存单元的安全保护,隔离,
且可有效支持大量应用程序分散地使用大内存的情况。

在操作系统完成对80386处理器页机制的初始化和配置
(主要是需要操作系统通过特定的指令和操作建立页表,完成虚拟地址与线性地址的映射关系)后,
应用程序看到的逻辑地址先被处理器中的段管理功能单元转换为线性地址,
然后再通过80386处理器中的页管理功能单元把线性地址转换成物理地址。

页机制和段机制有一定程度的功能重复,但Intel公司为了向下兼容等目标,使得这两者一直共存。

上述三种地址的关系如下:

分段机制启动、分页机制未启动:逻辑地址--->段机制处理--->线性地址=物理地址

分段机制和分页机制都启动:逻辑地址--->段机制处理--->线性地址--->页机制处理--->物理地址

Intel 80386寄存器

80386的寄存器可以分为8组:
    通用寄存器,
    段寄存器,
    指令指针寄存器,
    标志寄存器,
    系统地址寄存器,
    控制寄存器,
    调试寄存器,
    测试寄存器,
    它们的宽度都是32位。
    一般程序员看到的寄存器包括通用寄存器,段寄存器,指令指针寄存器,标志寄存器。

A. General Register(通用寄存器):

    EAX/EBX/ECX/EDX/ESI/EDI/ESP/EBP,
  这些寄存器的低16位就是8086的
    AX/BX/CX/DX/SI/DI/SP/BP,
  对于AX,BX,CX,DX这四个寄存器来讲,
  可以单独存取它们的高8位和低8位 (AH,AL,BH,BL,CH,CL,DH,DL)。
  
  它们的含义如下:
    EAX:累加器
    EBX:基址寄存器
    ECX:计数器
    EDX:数据寄存器
    ESI:源地址指针寄存器
    EDI:目的地址指针寄存器
    EBP:基址指针寄存器
    ESP:堆栈指针寄存器    

B. Segment Register(段寄存器,也称 Segment Selector,段选择符,段选择子):

除了8086的4个段外(CS,DS,ES,SS),
80386还增加了两个段FS,GS,
这些段寄存器都是16位的,
用于不同属性内存段的寻址,它们的含义如下:

CS:代码段(Code Segment)
DS:数据段(Data Segment)
ES:附加数据段(Extra Segment)
SS:堆栈段(Stack Segment)
FS:附加段
GS: 附加段

C. Instruction Pointer(指令指针寄存器):

    EIP的低16位就是8086的IP,
    它存储的是下一条要执行指令的内存地址,
    在分段地址转换中,
    表示指令的段内偏移地址。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flag Register(标志寄存器):

EFLAGS,和8086的16位标志寄存器相比,
增加了4个控制位,
这20位控制/标志位的位置如下图所示:

相关的控制/标志位含义是:
    1. CF(Carry Flag):    进位标志位;
    2. PF(Parity Flag):   奇偶标志位;
    3. AF(Assistant Flag):辅助进位标志位;
    4. ZF(Zero Flag):     零标志位;
    5. SF(Singal Flag):   符号标志位;
    6. IF(Interrupt Flag):中断允许标志位,由CLI,STI两条指令来控制;
                        设置IF位使CPU可识别外部(可屏蔽)中断请求,
                        复位IF位则禁止中断,
                        IF位对不可屏蔽外部中断和故障中断的识别没有任何作用;
    7. DF(Direction Flag):向量标志位,由CLD,STD两条指令来控制;
    8. OF(Overflow Flag): 溢出标志位;
    9. IOPL(I/O Privilege Level):I/O特权级字段,它的宽度为2位,它指定了I/O指令的特权级。
                        如果当前的特权级别在数值上小于或等于IOPL,那么I/O指令可执行。
                        否则,将发生一个保护性故障中断;
    a. NT(Nested Task):控制中断返回指令IRET,它宽度为1位。若NT=0,则用堆栈中保存的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day53|动态规划part14: 1143.最长公共子序列、1035. 不相交的线、53. 最大子序和

1143. 最长公共子序列 leetcode链接:力扣题目链接 视频链接:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。 如果不存在 公共子序列 …

在工具提示中使用自绘修改字体

在上一篇文章中,我们学习了如何在应用程序中添加工具提示。在之前的例子代码中,我们通过简单地为创建的工具提示设置了目标字体,这种方法很简单,因为自始至终,我们都只创建了一个工具提示。 但是,如果在应…

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小(代价)生成树时,可能是Kruskal算法第2次选中但不是Prim算法(从v4开始)第2次选中的边是(C) A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …

亚马逊,eBay,速卖通买家账号是如何实现高权重,高存活率的

现在测评,补单机构越来越多,看似寻常的便捷渠道也潜藏着很大的风险,尤其是当大量机器代替人工、各种质量参差不齐的测评机构被曝光,跨境卖家“踩坑遇骗”的情况也就屡屡出现。很多卖家都选择自己注册买家账号,自己做测…

YOKOGAWA CP461-50处理器模块

数据处理能力: CP461-50 处理器模块具有强大的数据处理能力,用于执行各种控制和数据处理任务。 多通道支持: 该模块通常支持多通道输入和输出,允许与多个传感器和执行器进行通信。 通信接口: CP461-50 处理器模块通常…

一文了解气象站是什么,作用有哪些?

气象站被广泛应用于气象、农业、交通、能源、水利、环保等领域,是一种用于收集、分析和处理气象数据的设备,能够为人们提供及时、准确的气象数据和决策支持。 气象站一般由传感器、环境监控主机和监控平台组成。传感器能够测量各种气象要素,…

【leetcode 力扣刷题】数学题之数的开根号:二分查找

用二分查找牛顿迭代解决开根号 69. x的平方根367. 有效的完全平方数 69. x的平方根 题目链接:69. x的平方根 题目内容: 题意是要我们求一个数的算数平方根,但是不能使用内置函数,那么我们就暴力枚举。我们知道如果y>2的话&am…

2023-9-2 Kruskal算法求最小生成树

题目链接&#xff1a;Kruskal算法求最小生成树 #include <iostream> #include <algorithm>using namespace std;const int N 200010;// 与并查集中的p含义相同 int p[N];struct Edge {int a, b, w;bool operator< (const Edge & W)const{return w < W.w…

广场舞音乐制作软件,FL Studio怎么做广场舞音乐

广场舞一直以来都是许多人日常的消遣方式之一&#xff0c;富有节奏感的音乐能够让人沉浸其中&#xff0c;这也说明了音乐的重要性。那么如果我们想自己制作一个广场舞风格的音乐&#xff0c;需要具备哪些条件呢&#xff1f;今天我们就来说一说广场舞音乐制作软件&#xff0c;FL…

分页功能实现

大家好 , 我是苏麟 , 今天聊一聊分页功能 . Page分页构造器是mybatisplus包中的一个分页类 . Page分页 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</ver…

指针结构体题

目录 初阶指针_指针的概念 1.使用指针打印数组内容 2.字符串逆序 3.整形数组和字符串数组 4.打印菱形 5.打印水仙花数 6.计算求和 结构体 7.喝汽水问题 8.程序死循环解释 9.选择题总结tips 今天是重点是指针&结构体题题目。&#x1f197;&#x1f197;&#x…

(超简单)将图片转换为ASCII字符图像

将一张图片转换为ASCII字符图像 原图&#xff1a; 效果图&#xff1a; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileWriter; import java.io.IOException;public class ImageToASCII {/*** 将图片转换为A…

dlopen “libnvcuvid.so“ failed!

在使用NVIDIA DALI库进行视频数据处理时&#xff0c;出现了以上打开libnvcuvid.so动态库错误的问题&#xff0c;如下图所示&#xff1a; libnvcuvid.so是使用CUDA进行硬编解码需要的一个库&#xff0c;使用NVIDIA DALI进行视频处理时会依赖它。 本人是在Docker容器中运行的程序…

Flink实时计算中台Kubernates功能改造点

背景 平台为数据开发人员提供基本的实时作业的管理功能,其中包括jar、sql等作业的在线开发;因此中台需要提供一个统一的SDK支持平台能够实现flink jar作业的发布;绝大多数情况下企业可能会考虑Flink On Yarn的这个发布模式,但是伴随云原生的呼声越来越大,一些企业不希望部…

肖sir__linux详解__002(系统命令)

linux系统命令 1、df 查看磁盘使用情况 &#xff08;1&#xff09;df 查看磁盘使用情况&#xff08;按kb单位显示&#xff09; &#xff08;2&#xff09;df -h 按单位显示磁盘使用情况 2、top 实时查看动态进程 &#xff08;1&#xff09;top 详解&#xff1a; 第一行&…

股票贷款行业,给你一个低成本有效的获客渠道

我们比市场上的同行公司具有更多的质量优势。我们的推广部门不断使用大数据引导和定位技术以及促销策略的迭代升级&#xff0c;具有足够强大的硬实力&#xff0c;可以引导客户提供更优质的投资者。为金融公司带来更好的资源。现在的股票加粉主要是&#xff1a;微信加粉/Q组/留电…

C语言:三子棋小游戏

简介&#xff1a; 目标很简单&#xff1a;实现一个 三子棋小游戏。三子棋大家都玩过&#xff0c;规则就不提及了。本博文中实现的三子棋在对局中&#xff0c;电脑落子是随机的&#xff0c;不具有智能性&#xff0c;玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一…

2023年王炸面试题每日一练--为什么会有精度的损失

基本数据类型中为什么会出现精度损失&#xff0c;怎么样会避免出现精度损失 loat 32位 出现精度损失的原因&#xff1a; 输入的值为十进制&#xff0c;而在计算的过程中&#xff0c;是要把十进制的小数位值在有限位的情况下转变为二进制的小数&#xff0c;就会出现精度的损失…

十一、MySQL(DQL)聚合函数

1、聚合函数 注意&#xff1a;在使用聚合函数时&#xff0c;所有的NULL是不参与运算的。 2、实际操作&#xff1a; &#xff08;1&#xff09;初始化表格 &#xff08;2&#xff09;统计该列数据的个数 基础语法&#xff1a; select count(字段名) from 表名; &#xff1b;统…

绿色光伏代步工具

太阳能是可再生能源&#xff0c;光线的来源是太阳&#xff0c;几乎不会枯竭。相比化石燃料等非可再生能源&#xff0c;太阳能的利用不会对资源造成耗竭和短缺问题&#xff0c;在现今社会中的文化&#xff0c;旅游层面&#xff0c;也已经得到充分的发展和拓展出多方面的应用模式…