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章的时候 ...
随机推荐
- 《精通Spring4.X企业应用开发实战》读后感第六章(引用Bean的属性值)
- python包管理
如果是python 项目目录,例如pycharm里新建的python项目,则可以通过from,import导入目录下的文件夹. 如果是普通文件目录,则代码里不能相对方式导入该目录下的文件夹,需要加入要 ...
- web 系统原理之路由器和交换机的区别
工作层次不同: 交换机主要工作在数据链路层(第二层) 路由器工作在网络层(第三层). 转发依据不同: 交换机转发所依据的对象时:MAC地址.(物理地址) 路由转发所依据的对象是:IP地址.(网络地址) ...
- MATLAB求解非齐次线性方程组
例如方程组: 法1:左除法 >> A=[3 1 -1;1 2 4;-1 4 5];b=[3.6;2.1;-1.4]; >> x=A\b x = 1.4818 -0.4606 0 ...
- 解决Navicat无法连接到Mysql
Navicat无法连接到Mysql,返回的错误码是Lost connection to MySQL server at ‘reading initial communication packet’, ...
- CircleCI 与持续集成
CircleCI 入门 最近在完成老师的作业:使用 CircleCI 进行持续集成,现将过程书写下来,与大家一起学习进步. A. What is CircleCI? 1. 什么是持续集成 持续集成(C ...
- 洛谷P2746 校园网Network of Schools
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校").注意即使 \(B\) 在 \(A\) 学校的分发列表中, \(A ...
- 理解js继承的6种方式
想要继承,就必须要提供个父类(继承谁,提供继承的属性) 一.原型链继承 重点:让新实例的原型等于父类的实例. 特点:1.实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性.(新 ...
- JavaScript高级程序设计第三版-读书笔记(1-3章)
这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript 提供核心语言功能 DOM 提供访问 ...
- Angular学习笔记【如何正确使用第三方组件】
例如:ng-bootstrap的使用: 1.首先肯定是先要安装,参考官网给出的指令安装即可.(npm install --save @ng-bootstrap/ng-bootstrap) 2.在App ...