CPU保护模式DPL、CPL简易理解
现代INTEL CPU都有保护模式,实模式这两种CPU运行模式。当CPU加电,CPU初始化时就运行在是模式下,然后现代操作系统会从实模式跳转到保护模式!
为什么需要保护模式?
在最开始编程的汇编时代,程序员的工作就是读懂处理器指令,然后用这些指令来写程序完成工作!一个程序员要写一个程序,这个程序包括了驱动CPU,驱动内存,驱动磁盘等所有的代码,否则就是一颗裸CPU无法运行!后来每一个程序员都觉得这些驱动过程几乎一样,所以就开始构写操作系统,然操作系统来干这些事情!操作系统(这里指的是最原始的操作系统,其功能只完成一个,比如完成计算器功能)写完之后,后一代的程序员要写程序,还是要读懂CPU指令,只是不需要再从头到会驱动所有硬件了!操作系统后来走向商业化,一些程序员写的操作系统拿出来卖,然后其他程序员在操作系统的基础之上来写程序!这个时候就遇到一个问题!因为操作系统的编写所使用的工具(CPU指令)和那些程序员所使用的工具(CPU指令)都是一样的!而且水平也几乎差不多,所以这个时候的程序员就有能力直接修改操作系统的某个指令(操做系统加载在内存中,那个时候程序员可以通过指令直接修改内存里任何位置的任何数据,从而导致修改了原始操作系统本身),来完成自己所需要的任务(想一想现在的程序员有几个有能力通过汇编直接去修改windows内核呢)!起初,这些修改非常合理。随着计算机的操作系统的发展,原始操作系统功能逐渐增加,所程序员水平的下降,程序员随意修改操作系统指令,就会导致操作系统的崩溃,这种崩溃就如滚雪球一般越来越多,越来越普遍,所以必须要启用一种机制让非系统程序员不能随意更改操作系统的指令!这个机制就是保护模式
保护模式是如何起到保护作用的呢?
你想想,如果你是INTEL CPU设计师,出现这个问题时,你要如何来设计让其他程序员不能在内存中随意修改你的代码这种保护机制?
我能想到最简单的方式就是,不允许其他程序员访问操作系统内核的内存:将操作系统加载到内存地位,每当用户一个指令需要访问内存时,就判断当前访问的地址是否在操作系统的内存范围内,如果是就报错,否则读取内存!如果你也是这样想,那么恭喜你,可以去INTEL当CPU构架师,当上总经理,出任CEO,打败高富帅,迎娶白富美,走上人生的巅峰。你的操作系统内存范围在INTEL中有个专有名词叫做 段 !!!在CPU级别的编程中,程序是由 段 构成。你的一整条内存,被切割成不同的 段 。每一个段有自己的属性和权限!INTEL 80286 CPU对于程序段的权限有四个等级 0、1、2、3!数字越大,权限越小(请重复读一千遍,再继续阅读下文)!通常你的操作系统就是权限最高的等级0。普通程序段处于等级3。INTEL 代码段有个DPL属性,可以让你来定义你的程序段的等级
现在你要计算2的20次方是多少,你在你的操作系统下,就需要自己的写这个算法的实现,别人用你的系统时也需要去实现这个功能!重构的思想在你脑袋里胡鹏乱撞。你为什么不把这种算法公开给其他程序员使用呢?为什么要浪费精力去重新写算法呢?但是你的操作系统代码不允许任何人访问,这又是一个问题!为了解决这个问题INTEL 给代码段增加了一个属性:代码是否一致
代码一致:允许代码段等级相同和代码段等级较低的代码访问
代码非一致:只有代码段等级相同可以访问
所以就只需要将你的幂计算的数学实现代码段设置为代码一致,就可以让权限较低的代码段访问了!
等级怎么跳转?
每个代码段都一个DPL,CPU当前所要执行的指令cs:ip的DPL是多少呢?当然就是指令所在段的DLP!假设cs:ip的指令属于代码段1,而即将要执行的指令是jmp 代码段2:偏移。那这个时候CPU怎么运行?代码段2有一个DPL,代码段1也有一个DPL,这个时候CPU当然要比较目前的代码段1!实际上每次代码段跳转之后,就会将代码段的DPL记录在CS寄存器的低2位,这个2位被称为CPL。也就是说CPL实际上就是DPL(代码段被加载后DPL的另一个名字,如果代码段没有被加载,说一个段的CPL没有任何意义)。但是这里有一个例外:如果要跳转的代码段是一致代码段,跳转过后CPL不会修改为一致代码段的CPL,而是保持上一个段的CPL
CPL和DPL如何比较?
说到比较,就得有一个比较对象和比较规则,比较目的,不同对象之间的比较意义不是很大——手机比大象小、猩猩比美女黑。。
比较对象:代码段的权限。各自对对应的代码段的权限
比较目的:权限大小。比较各自代码段对应的权限大小。
比较规则:因为代码段有很多种(代码段的种类通常是由代码段的属性定义)!所以对于不同的代码段,DPL有不同的意义!也就代表了不同的比较规则。皇帝的DPL和太监的DPL肯定代表不同的意义。下面来看一下各种代码段的DPL定义
- 数据段、调用门、TTS的DPL:最低权限——CPL的权限比DPL的权利更大!县长最低需要的权利值(省长或省长以上的官才能够提出意见)
- 一致代码段、非一致代码段(通过调用门访问):最高权限——CPL的权利比DPL的权利小!(你就是总统也必须没有权利干涉我州的事情)
- 非一致代码段(不通过调用门访问):同级权限——(我是省长,你也必须是省长)!
什么又是RPL?
网上说RPL是程序员一个意图,就是程序在编写时,程序员一厢情愿的希望某个代码段是哪个等级!但是实际在运行过程中,CPU还是要看代码段本身的CPL等级!如果RPL等级更低,就用更低的权限跳转到目标段,如果更高,就用CPL的权限跳转到目标段!我不太理解这样做有什么意义,希望有人知道的,能指点我,谢谢!
CPU保护模式DPL、CPL简易理解的更多相关文章
- CPU保护模式深入探秘
原文链接为:http://www.chinaunix.net/old_jh/23/483510.html 保护方式的体系结构 主要问题: 保护方式的寄存器模型 保护 ...
- 自制操作系统Antz(5)——深入理解保护模式与进入方法
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...
- 保护模式下pmtest1.asm的理解
整个代码对应内存线性地址分为四段,[gdt] [code32] [video32] [code16] 代码先在实模式[code16]下运行,code16中的cs就是系统分配的该程序物理地址的基址. 编 ...
- 【理解OS】1.保护模式概述
这个系列文章主要目的是为了记录我个人学习保护模式后的总结与一点点的思考.我也是一个学习者,其中由错误在所难免,若各位朋友指出将不胜感激. 1. Intel CPU的运行模式概述 这里我将粗略介绍Int ...
- 保护模式篇——TLB与CPU缓存
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述
★PART1:32位保护模式下任务的隔离和特权级保护 这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...
- oslab oranges 一个操作系统的实现 实验二 认识保护模式
https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...
- ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务
★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...
- ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换
15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...
随机推荐
- Material使用10 MdRadioModule、MdDatepickerModule、MdNativeDateModule、MdSelectModule
1 MdRadioModule 相当于<input type="radio"> 2 使用步骤 2.1 在共享模块导入MdRadioModule import { NgM ...
- if if 和 if elif 的区别
再一次编程中意外使用了if if 也实现了 if elif的功能,所以搜索了下其中的区别: 1.if if 和 if elif 是有区别的,只是在某些情况下才会一样的效果: 2.随意使用会导致意外的错 ...
- 积累遇到过的linux终端操作指令
mkdir mkdir命令是常用的命令,用来建立空目录,它还有2个常用参数: -m, --mode=模式 设定权限<模式> (类似 chmod) -p, --parents 需要时创建上层 ...
- C#中类和结构体
结构体 类 自己的一些理解 首先结构中不能给字段赋值 而类可以 结构调用方法是 例如 People p1: 类的调用方法是 Book b =new Book(): 1.类能够实例化 而结构不可以 ...
- Algorithms - Fibonacci Number
斐波那契数列(Fibonacci Number)从数学的角度是以递归的方法定义的: \(F_0 = 0\) \(F_1 = 1\) \(F_n = F_{n-1} + F_{n-2}\) (\(n \ ...
- ApiDoc 一键生成注释
本文来自网易云社区. 作者:盛国存 背景 我们日常在使用ApiDoc维护管理api文档,提高了api文档的整体维护性.但在老旧接口中,补充接口注解无疑是一次繁重的体力劳动.仔细查看,大多数接口的格式 ...
- [CentOS7] 通过vncviewer屏幕扩展
方法一:通过vncserver来调整分辨率 这是博主最近才发现的,原来还可以直接通过在服务端通过设置vncserver来调整分辨率,方法如下: 接下来,我们要进行vncviewer屏幕扩展的设置: 点 ...
- java 提取(解压)zip文件中特定后缀的文件并保存到指定目录
内容简介 本文主要介绍使用ZipFile来提取zip压缩文件中特定后缀(如:png,jpg)的文件并保存到指定目录下. 导入包:import java.util.zip.ZipFile; 如需添加对r ...
- java 提取(解压)rar文件中特定后缀的文件并保存到指定目录
内容简介 本文主要介绍使用junrar来提取rar压缩文件中特定后缀(如:png,jpg)的文件并保存到指定目录下. 支持v4及以下版本压缩文件,不支持v5及以上. 在rar文件上右键,查看属性,在压 ...
- JDK动态代理和cglib代理
写一个简单的测试用例,Pig实现了Shout接口 public class MyInvocation implements InvocationHandler { Object k; public M ...