【操作系统真象还原】第4章:保护模式入门(4.4~4.5节)

news2024/11/29 6:38:26

目录

4.4 处理器微架构简介

4.4.1 流水线

4.4.2 乱序执行

4.4.3 缓存

4.4.4 分支预测

4.5 使用远跳转指令清空流水线,更新段描述符缓冲寄存器

4.6 保护模式之内存段的保护

4.6.1 向段寄存器加载选择子时的保护

4.6.2 代码段和数据段的保护

4.6.3 栈段的保护


4.4 处理器微架构简介

了解处理器内部硬件架构,有助于理解软件运行原理,因为这两者本身相辅相成,相互依存。

4.4.1 流水线

表 4-13 的过程便是一个流水线的执行过程,由于砸钉子分为两个步骤,所以以上流水线称为二级流水线。

CPU 的指令执行过程分为取指令、译码、执行三个步骤。每个步骤都是独立执行的,CPU 可以一边执行指令,一边取指令,一边译码。(CPU 在遇到无条件转移指令 jmp 时,会清空流水线。)

从第 2 秒后,每 0.5 秒就会有一个砸钉子的动作,所以在以后的每分钟内,都会钉入 120 个钉子,速度又提高了很多。这就是将指令拆分成多个微操作后的效率提升。(因为微操作的周期短)

流水线是 CPU 提高效率的一种出路,以后介绍的各种优化方法,其实都是围绕如何让流水线更加有效而展开的。

4.4.2 乱序执行

乱序执行:是指在 CPU 中运行的指令并不按照代码中的顺序执行,而是按照一定的策略打乱顺序执行,也许后面的指令先执行,当然,得保证指令之间不具备相关性

CISC (Complex Instruction Set Computer),意为复杂指令集计算机,不断地往 CPU 中添加各种指令,甚至在 CPU 硬件一级直接支持软件中的某些操作,以至于指令集越来越庞大笨重复杂。

RISC (Reduced Instruction Set Computer ),意为精简指令集计算机,精简保留了那些常用的指令,这些指令大多数都是不可再细分的,也就是说它们基本上都是属于微操作级别的指令。

乱序执行的好处就是后面的操作可以放到前面来做,利于装载到流水线上提高效率

4.4.3 缓存

缓存是 20 世纪最大的发明,其原理是用一些存取速度较快的存储设备作为数据缓冲区,避免频繁访问速度较慢的低速存储设备。

SRAM,即静态随机访问存储器,是最快的存储器。寄存器和 SRAM 都是用相同的存储电路实现的,用的都是触发器,是工作速度极快的,属于纳秒级别。

局部性分为以下两个方面:(将当前用到的指令当前位置附近的数据都加载到缓存中)

  • 时间局部性:最近访问过的指令和数据,在将来一段时间内依然经常被访问。
  • 空间局部性:靠近当前访问内存空间的内存地址,在将来一段时间也会被访问。

4.4.4 分支预测

CPU 中的指令是在流水线上执行的。

分支预测:是指当处理器遇到一个分支指令时,是该把分支左边的指令放到流水线上,还是把分支右边的指令放在流水线上。

如何把握好转移的方向,才是使流水线保持高效的关键。所谓的预测是针对有条件跳转来说的。

Intel的分支预测部件中用了分支目标缓冲器(Branch Target Buffer,BTB )。

如果 BTB 中没有相同记录,这时候可以使用 Static Predictor,静态预测器。存储在里面的预测策略是固定写死的,它是由人们经过大量统计之后,根据某些特征总结出来的。如,若循环结构向上跳转则转移会发生,若向下跳转则转移不发生。

预测错了就清空流水线即可,根据实际情况更新BTB。

4.5 使用远跳转指令清空流水线,更新段描述符缓冲寄存器

代码段寄存器 cs,只有用远过程调用指令 call,远转移指令 jmp,远返回指令 retf 等指令间接改变。CPU 遇到 jmp 指令时,之前已经送上流水线上的指令只有清空,所以 jmp 指令有清空流水线的神奇功效。

4.6 保护模式之内存段的保护

保护模式中的保护二字主要体现在段描述符的属性字段中,每个字段都不是多余的。这些属性只是用来描述一块内存的性质,是用来给 CPU 做参考的,当有实际动作在这片内存上发生时,CPU用这些属性来检查动作的合法性,从而起到了保护的作用。

4.6.1 向段寄存器加载选择子时的保护

当引用一个内存段时,实际上就是往段寄存器中加载个选择子,为了避免出现非法引用内存段的情况,在这时候,处理器会在以下几方面做出检查:

(1) 首先根据选择子的值验证段描述符是否超越界限:判断的标准是选择子的索引值一定要小于等于 描述符表( GDT 或 LDT) 中描述符的个数。 描述符表基地址+选择子中的索引值*8+7 <= 描述符表基地址+描述符表界限值
处理器先检查 TI 的值,如果 TI 是 0,则从全局描述符表寄存器 gdtr 中拿到 GDT 基地址和 GDT 界限值。如果 TI 是 1,则从局部描述符表寄存器 Idtr 中拿到 LDT 基地址和 LDT 界限 值。有了描述符表基地址和描述符表界限值后,把选择子的高 13 位代入上面的表达式,若不成立,处理器则抛出异常。
 
(2) 检查段寄存器的用途和段类型是否匹配:(段描述符中有个 type 字段,这用来表示段的类型,也就是不同的段有不同的作用。)
  • 只有具备可执行属性的段(代码段),才能加载到 cs 段寄存器中。
  • 只具备执行属性的段(代码段),不允许加载到除 cs 外的段寄存器中。
  • 只有具备可写属性的段(数据段),才能加载到 SS 栈段寄存器中。
  • 至少具备可读属性的段才能加载到 DS ES FS GS 段寄存器中。
 
(3) 检查段是否存在:CPU 通过段描述符中的 P 位来确认内存段是否存在,如果 P 位为 1,则表示存在,这时候就可以将选择子载入段寄存器了,同时段描述符缓冲寄存器也会更新为选择子对应的段描述符的内容,随后处理器将段描述符中的 A 位置为,表示己经访问过了。若为 0 则会抛出异常,处理器会转去执行相应的 异常处理程序,然后处理完接着回来执行。
以上所涉及到的 P 位,其值由软件(通常是操作系统)来设置,由 CPU 来检查。A 位由 CPU 来设置。

4.6.2 代码段和数据段的保护

对于代码段和数据段来说,CPU 每访问一个地址,都要确认该地址不能超过其所在内存段的范围。

若 G 为 0,表示段界限的单位是 1 字节;若 G 为 1,表示段界限的单位是 4KB。

段界限就是以 0 为起始的段偏移量???

实际的段界限大小,是段内最后一个可访问的有效地址。

实际段界限的值为: (描述符中段界限+1) * (段界限的粒度大小: 4k 或者 1) -1。(规定就是这么算的吧🤔️)

对于 G 位为 4k 粒度大小的段来说:实际段界限大小 = (描述符中段界限+1) *4k-1=描述符中段界限*4k+4k-1=描述符中段界限*0x1000+0xFFF。

在 IA32 体系结构中,访问内存就要用分段策略。
代码段也是内存中的区域,所以对于代码段的访问也要用 “段基址:段内偏移地址” 的形式,32 位保护模式下,段基址存放在 cs 寄存器中, 段内偏移地址,即有效地址,存放在 EIP 寄存器中。
CS: EIP 只是指令的起始地址,指令本身也是有长度的。
CPU 得确保指令 “完全,完整” 地任意一部分都在当前的代码段内,也就是要满足以下条件:
  • EIP 中的偏移地址+指令长度 <= 实际段界限大小。
  • 数据段的偏移地址+数据长度 <= 实际段界限大小。

段界限大小规定的好像就是段内最后一个可访问的有效地址,和段基址一起规定了段的大小范围🤔️,这里的有效地址是指偏移地址吗???

4.6.3 栈段的保护

栈顶指针[e]sp 的值逐渐降低,这是 push 指令的作用,与描述符是否向下扩展无关,也就是说,是数据段就可以用作栈。

CPU 对数据段的检查,其中一项就是看地址是否超越段界限。如果将向上扩展的数据段用作栈,那 CPU 将按照之前提到的数据段的方式检查该段。如果用向下扩展的段做栈的话,情况有点复杂,这体现在段界限的意义上。

  • 对于向上扩展的段,实际的段界限是段内可以访问的最后一字节。
  • 对于向下扩展的段,实际的段界限是段内不可以访问的第一个字节。

地址本身由低地址向高地址发展。

这里有点懵🤔️ 

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

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

相关文章

CentOS7 网络配置

在Linux系统下 查询CentOS7的ip地址 输入ip查询命名 ip addr 也可以输入 ifconfig查看ip&#xff0c;但此命令会出现3个条目&#xff0c; centos的ip地址是ens33条目中的inet值。 输入命令: ip addr 结果如下: 使用: ifconfig 命令查询结果如下: 发现 ens33 没有 inet 这个属性…

国内半导体分立器件逐步向高端应用市场推进,未来可期

分立器件行业概况 半导体分立器件是半导体产业的基础及核心领域之一&#xff0c;其具有应用领域广阔、高成品率、特殊器件不可替代等特性。 从市场需求看&#xff0c;分立器件受益于物联网、可穿戴设备、智能家居、健康护理、安防电子、新能源汽车、智能电网、5G通信射频等市…

如何在华为OD机试中获得满分?Java实现【云短信平台优惠活动】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 某云短信厂商,为庆祝国…

如何建立自己的微信小程序,做一个微信小程序大概多少钱?

如今&#xff0c;小程序的功能越来越强大&#xff0c;也越来越受欢迎&#xff0c;它不仅能帮助企业和商家做推广&#xff0c;还能给他们带来很多好处。所以&#xff0c;很多企业都开始建立自己的小程序。但是对于如何建立自己的微信小程序&#xff0c;以及做一个微信小程序大概…

Zemax Lumerical | 二维光栅出瞳扩展系统优化

简介 本文提出并演示了一种以二维光栅耦出的光瞳扩展&#xff08;EPE&#xff09;系统优化和公差分析的仿真方法。 在这个工作流程中&#xff0c;我们将使用3个软件进行不同的工作 &#xff0c;以实现优化系统的大目标。首先&#xff0c;我们使用 Lumerical 构建光栅模型并使用…

基于C++的网盘系统项目开发教程

项目资源下载 基于C的网盘系统项目源码CSDN下载地址基于C的网盘系统项目源码GitHub下载地址 项目简介 本项目基于C开发&#xff0c;整个项目采用C/S架构&#xff0c;使用Sqlite3数据库存储用户信息&#xff0c;本地磁盘存储用户文件&#xff0c;使用Socket进行客户端和服务器之…

智能指针: share_ptr(共享智能指针)

智能指针 c中不像java自带垃圾回收机制&#xff0c;必须释放掉分配的内存&#xff0c;否则机会造成内存泄漏。因此c11加入了智能指针。智能指针是存储指向动态分配&#xff08;堆&#xff09;对象指针的类&#xff0c;用于生存期的控制&#xff0c;能够确保在离开指针所在作用…

Selenium4自动化框架(超级详细)

目录 Selenium4 安装Selenium 安装浏览器驱动 实战案例 导入模块及浏览器驱动 导入模块 启动驱动 定位元素 id、name、class定位 tag_name定位 xpath定位 css选择器定位 link_text、partial_link_text定位 其他定位 定位一组元素 执行操作 浏览器操作 获取信息…

1. 自然语言处理NLP-数据预处理

NLP任务预处理的流程包括&#xff1a; 收集语料库、文本清洗、分词、去掉停用词、标准化和特征提取等。 &#xff08;1&#xff09;收集语料库 &#xff08;2&#xff09;清洗数据 eg&#xff1a;删除所有不相关的字符&#xff0c;例如非字母数字字母 &#xff08;3&#xff09…

Java Servlet相关面试题

一、什么是servlet&#xff1f; Servlet是运行在java服务器中的小型Java程序。 作用&#xff1a;接收用户请求&#xff0c;并对请求作出处理&#xff0c;将处理结果相应给客户端。 Servlet是JavaWeb三大组件&#xff08;Servlet、过滤器&#xff0c;监听器 &#xff09;之一…

C++学习day--12 循环

第 1 节: 需求分析、项目实现——重复验证 项目实现&#xff1a; #include <iostream> #include <Windows.h> #include <string> using namespace std; int main(void) { string name; string pwd; while (1) { system("cls"); std::cout <…

Windows编辑开发中的内聚性、内聚类型、耦合性和耦合类型

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows编辑开发中的内聚性、内聚类型、耦合性和耦合类型。 软件设计的基本原则是信息隐蔽性与模块独立性。 模块设计目标是高内聚&#xff0c;低耦合。 然后记住下面这张神图&#xff0c;一张…

Mybatis之MetaObject

在mybatis中&#xff0c;ResultSetHandler在收集JDBC返回的结果后需要转换成对应的Bean对象&#xff0c;其实映射的原理基本大家都能想到使用的时候java中的反射机制&#xff0c;但是在Mybatis中&#xff0c;提供了一个更加强大的对象&#xff0c;就是MetaObject&#xff0c;使…

Python - 面向对象编程 - 实例方法、静态方法、类方法

实例方法 在类中定义的方法默认都是实例方法&#xff0c;前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog:def __init__(self, name, age):print("自动调用构造方法")self.name nameself.age agedef test(self):print("一个实例方法&…

阿里P8写出的《深入理解Java虚拟机》最新版,轻松学会JVM底层

前言 Java是目前用户最多、使用范围最广的软件开发技术&#xff0c;Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三E方Java框架(如Spring、 MyBatis等) 构成。在国内&#xff0c;有关Java类库API、Java语言语…

能源汽车下乡充电桩建设优化建议及解决方案

安科瑞 耿敏花 摘 要&#xff1a;5月5日&#xff0c;国务院总理李强主持召开国务院常务会议&#xff0c;审议通过关于加快发展先进制造业集群的意见&#xff0c;部署加快建设充电基础设施&#xff0c;更好支持新能源汽车下乡和乡村振兴。 会议指出&#xff0c;农村新能源汽车市…

JavaScript 原型和原型链

文章目录 JavaScript 原型和原型链概述new操作符的流程原型对象、构造函数、实例关系原型链原型链查找hasOwnPropertyin JavaScript 原型和原型链 概述 任何函数都有prototype属性&#xff0c;prototype是原型的意思。 prototype的属性值是个对象&#xff0c;它默认拥有cons…

Java内存模型(Java Memory Mode,JMM)

并发编程模型的两个关键问题 线程之间如何通信及线程之间如何同步。 线程之间如何通信&#xff1a;共享内存&#xff0c;消息传递线程之间如何同步通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制在共享内存的并发模型里&a…

网络安全大厂面试题汇总

注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xff0c;更多的还是希望由点达面&#xff0c;查漏补缺。 ​ 某大厂一面整理 1、防范常见的 Web 攻击 2、重要协议分布层 3、ar…

c++使用yaml -基于windows10

参考&#xff1a;Windows10下使用VS2017编译和使用yaml-cpp库_雪域迷影的博客-CSDN博客 1. 下载yaml-cpp 建议在github下载其最新的官方版本&#xff0c;不要在其他平台下载该工具软件&#xff0c;下载地址如下&#xff08;其中的一个版本&#xff09;&#xff1a; Release …