现代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定义

  1. 数据段、调用门、TTS的DPL:最低权限——CPL的权限比DPL的权利更大!县长最低需要的权利值(省长或省长以上的官才能够提出意见)
  2. 一致代码段、非一致代码段(通过调用门访问):最高权限——CPL的权利比DPL的权利小!(你就是总统也必须没有权利干涉我州的事情)
  3. 非一致代码段(不通过调用门访问):同级权限——(我是省长,你也必须是省长)!  

什么又是RPL?

网上说RPL是程序员一个意图,就是程序在编写时,程序员一厢情愿的希望某个代码段是哪个等级!但是实际在运行过程中,CPU还是要看代码段本身的CPL等级!如果RPL等级更低,就用更低的权限跳转到目标段,如果更高,就用CPL的权限跳转到目标段!我不太理解这样做有什么意义,希望有人知道的,能指点我,谢谢!

CPU保护模式DPL、CPL简易理解的更多相关文章

  1. CPU保护模式深入探秘

    原文链接为:http://www.chinaunix.net/old_jh/23/483510.html 保护方式的体系结构 主要问题:          保护方式的寄存器模型          保护 ...

  2. 自制操作系统Antz(5)——深入理解保护模式与进入方法

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  3. 保护模式下pmtest1.asm的理解

    整个代码对应内存线性地址分为四段,[gdt] [code32] [video32] [code16] 代码先在实模式[code16]下运行,code16中的cs就是系统分配的该程序物理地址的基址. 编 ...

  4. 【理解OS】1.保护模式概述

    这个系列文章主要目的是为了记录我个人学习保护模式后的总结与一点点的思考.我也是一个学习者,其中由错误在所难免,若各位朋友指出将不胜感激. 1. Intel CPU的运行模式概述 这里我将粗略介绍Int ...

  5. 保护模式篇——TLB与CPU缓存

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  7. oslab oranges 一个操作系统的实现 实验二 认识保护模式

    https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  9. ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换

    15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...

随机推荐

  1. Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数

    Python 函数式编程 2 返回函数 返回函数的意思就是:函数作为返回值.(高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.) 举个例子:实现一个可变参数的求和. 正常的函数: de ...

  2. 杭电acm 1040题

    本题是一个非常简单的升序排序题目,但那时在做的时候把题目看错了,导致花费了大量的时间来检查为什么WA,最后发现题目看错了..... /********************************* ...

  3. 31.TCP/IP 三次握手与四次挥手

    TCP/IP三次握手 TCP建立连接为什么是三次握手,而不是两次或四次? TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6. 顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手 ...

  4. (linux)安装redis---简装

    redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了memcached的不足,它支持存储的value类型相对更多,包括strin ...

  5. Linux基础学习(一)

    前言:这个学习笔记是为了督促自己能够更好的学习Linux的有关知识. 参考书目 鸟哥的linux私房菜 Chapter 1:入门建议 新手建议:重点 基础一定一定要学好 那么什么是基础呢? 先从Lin ...

  6. 799C(xjb)

    题目链接: http://codeforces.com/problemset/problem/799/C 题意: 有c, d两种货币, 有 n 个货物, 可以用 c 货币或者 d 货币购买, 现在需要 ...

  7. c++手工扩栈

    -Wl,--stack=64000000 c++手工扩展

  8. centos 7 安装python3

    centos系统默认已安装python2.7,python3需要手动安装.以上是安装步骤 一.备份原来的2.7版本 首先看一下默认的python2.7在哪里 [root@apple ~]# cd / ...

  9. linux中使用wget模拟爬虫抓取网页

    如何在linux上或者是mac上简单使用爬虫或者是网页下载工具呢,常规的我们肯定是要去下载一个软件下来使用啦,可怜的这两个系统总是找不到相应的工具,这时wget出来帮助你啦!!!wget本身是拿来下载 ...

  10. 移动web 的viewport设置注意事项的详细解释 六一快乐=-_-_

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...