一步步编写操作系统 54 CPL和DPL入门1

我们在工作中,公司都给员工配有员工卡,此员工卡就是员工身份的“标签”,用它来出入公司、食堂就餐等。给公司创造价值的是员工的生产力,不是员工卡,员工卡只是公司人事部门管理员工的一种手段而已。

现在说计算机,既然是用特权级来维护计算机世界的和平,那总该给每个被管理的对象加个特权“标签”,也就是说cpu得知道谁的特权高谁的特权低,这样才能辨识出是否有低特权级的程序越级访问高特权级资源的违法行为。

员工的标签体现在工卡,计算机特权级的标签体现DPL,CPL和RPL,下面咱们围绕这几个概念展开讨论。

先看看访问者的特权标签在哪里。

最初我们刚接触保护模式的时候,最先感受到的区别是,访问内存不像在实模式下那么自由、直接啦,在保护模式下有了段描述符,访问内存得先经过它才行,它的作用是通过各种属性描述一段内存区域,该描述符就相当该内存区域的“身份证”。

前情提要,x86访问内存的机制是“段基址:偏移地址”,无论是实模式还是保护模式,都要遵循此方式。在实模式下,段基址直接写在段寄存器中,而在保护模式下,段寄存器中的不再是段基址,而是段选择子,通过该选择子从GDT或LDT中找到相应的段描述符,从该描述符中获取段的起始地址。大伙儿还记得选择子的结构吧,第0~1位是RPL字段,第2位是TI位,第3~15位是段描述符索引,好啦,回忆到此为止。咱们要关注的就是RPL字段,它就是请求特权级,后面讲RPL的时候咱们会细说。请求特权级中的“请求”是个动词,只有具备“能动性”的访问者才能做出动作。

话说回来了,谁是访问者?计算机中,具备“能动性”的只有计算机指令,只有指令才具备访问、请求其它资源的能力,指令便是资源的请求者。指令“请求”、“访问”其它资源的能力等级便称之为请求特权级,指令是存放在代码段中,所以,就用代码段寄存器CS中选择子的RPL位表示代码请求别人资源能力的等级。代码段寄存器CS和指令指针寄存器EIP中指向的指令便是当前在处理器中正在运行的代码,所以,位于CS寄存器中选择子低2位的值不仅称为请求特权级,又称为处理器的当前特权级,也就是说处理器的当前特权级是CS.RPL。

处理器的当前特权级的真实面目是什么?

在cpu运行的是指令,其运行过程中的指令总会属于某个代码段,该代码段的特权级(也就是代码段描述符中的DPL)便是当前cpu所处的特权级,这个特权级称为当前特权级,即CPL(Current Privilege Level),它表示处理器正在执行的代码的特权级别。除一致性代码段外(后面会说),转移后的目标代码据段的DPL是将来处理器的当前特权级CPL。

指令最终是用处理器执行的,执行到不同特权的代码,处理器的特权级就换到不同的等级。所以,当前特权级实际上是指处理器当前所处的特权级,是指处理器的特权角色,更形象一点地说,是指cpu当前在计算机世界中的特权地位。再次提醒大伙儿,在任意时刻,当前特权级CPL保存在CS中选择子中的RPL部分。

当前特权级是存储在CS.RPL中,谁为代码段寄存器CS赋值的呢? 要回答上面的问题,得先搞清楚处理器的当前特权级为什么会变化。

当前正在运行的代码所在的代码段的特权级DPL就是处理器的当前特权级,当处理器从一个特权级的代码段转移到另一个特权级的代码段上执行时,由于两个代码段的特权级不一样,处理器当前的特权身份起了变化,这就是当前特权级CPL改变的原因。好像说的有点神秘,其实就是使用了那些能够改变程序执行流的指令如int、call等,这样就使CS和EIP的值改变,从而使处理器执行到了不同特权级的代码。不过,特权转移可不是随便进行的,处理器要检查特权变换的条件,这里咱们暂不讨论条件是什么,因为它需要过会儿结合RPL一块说,等小弟把RPL给大伙儿说清楚了再解释这个“条件”不迟。当处理器特权级检查的条件通过后,新代码段的DPL就变成了处理器的CPL,也就是目标代码段描述符的DPL将保存在代码段寄存器CS中的RPL位。

总之,代码是资源的请求者,代码段寄存器CS所指向的是处理器中当前运行的指令,所以代码段寄存器CS中选择子的RPL位称为当前特权级CPL,这是再合理不过的事了。

RPL变成了CPL,似乎有点晕是吗?其实只是代码段寄存器CS中的RPL是CPL,其它段寄存器中选择子的RPL与CPL无关,因为CPL是针对具有“能动性”的访问者(执行者)来说的,代码是执行者,它表示访问的请求者,所以CPL只存放在代码段寄存器CS中低2位的RPL中。

以上几段内容想表达的就是处理器的当前特权级CPL为什么放在CS.RPL中,CPL和CS.RPL有什么关系,不信您再回头看一遍^_^。

大多数情况下,处理器都是在“访问者”访问“受访者”时进行特权检查,访问者(某个代码段)的特权就是当前特权级CPL,在进行特权检查时,都会以CPL为基础,说到这里,不禁我要自问一下,既然CPL就是目标代码段的DPL,那处理器总该有个初始CPL吧。答案是肯定的,特权级是保护模式下的概念,处理器进入保护模式后才有的当前特权级,让我们回忆下处理器是怎么进入保护模式的,也许答案自然就揭晓啦。

在这之前,我和大家说过,MBR从BIOS接过接力棒的时候,它已经处于0特权级啦,其实这么说不太合适,毕竟在保护模式下才有特权级,而MBR是运行在实模式下,还谈不上特权级。BIOS将控制权交给MBR,是用一个远跳转指令实现的,即jmp 0:0x7c00,也就是说进入MBR后,段寄存器CS会被替换为0,如果此时把CS看作是选择子的话,RPL的值为0,也就是说“相当于”处于0特权级,段寄存器CS为0的情况一直持续到在loader中进入保护模式之后的第一条指令:流水线刷新跳转。该跳转语句如图

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

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

相关文章

Coursera自动驾驶课程第4讲:Safety Assurance for Autonomous Vehicles

在上一讲《Coursera自动驾驶课程第3讲:Self-Driving Hardware and Software Architectures》中我们了解了自动驾驶汽车常用的传感器和硬件组件、软件系统。 本讲我们将学习新的模块,也是自动驾驶汽车最重要的模块之一:安全模块。 B站视频链…

【Codeforces - 1000C】Covered Points Count(思维,离散化,差分)

题干: You are given nn segments on a coordinate line; each endpoint of every segment has integer coordinates. Some segments can degenerate to points. Segments can intersect with each other, be nested in each other or even coincide. Your task i…

Coursera自动驾驶课程第5讲:Vehicle Dynamic Modeling

在上一讲《Coursera自动驾驶课程第4讲:Safety Assurance for Autonomous Vehicles》中我们了解了自动驾驶汽车中一个非常重要的模块:安全模块。 本讲我们将学习新的模块:汽车运动学和动力学模块。(这部分可能需要一定的理论力学和…

Java同步锁——lock与synchronized 的区别【转】

在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一、Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面…

Coursera自动驾驶课程第6讲:Vehicle Longitudinal Control

在上一讲《Coursera自动驾驶课程第5讲:Vehicle Dynamic Modeling》中我们了解了汽车运动学和动力学模块。 本讲我们继续学习新的模块:汽车纵向控制。具体地,我们将学习PID控制算法,看看该算法是如何在自动驾驶汽车中应用的。 B站…

Java并发:线程共享变量可见性原理

0、线程安全性:线程安全性包括两个方面,①可见性。②原子性。 0.1、线程之间的通信:线程的通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种共享内存和消息传递。 (1)在共…

Coursera自动驾驶课程第7讲:Vehicle Lateral Control

在上一讲《Coursera自动驾驶课程第6讲:Vehicle Longitudinal Control》中我们了解了如何使用PID算法进行汽车纵向控制。 本讲我们继续学习新的模块:汽车横向控制。具体地,我们将学习三种控制算法:Pure pursuit,Stanle…

Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision

在上一讲《Coursera自动驾驶课程第7讲:Vehicle Lateral Control》中我们了解了如何对汽车进行横向控制。 本课程第一个篇章就暂时告一段落了,接下来我们开始学习新的篇章。 课程第二个篇章是状态估计和定位模块。不过在这里我做了一下调整,我…

Coursera自动驾驶课程第9讲:Visual Features Detection Description and Matching

在上一讲《Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision》中我们学习了计算机视觉基本知识。 本讲我们将学习计算机视觉中的视觉特征模块。 B站视频链接:https://www.bilibili.com/video/BV1PE411D72p 文章目录1. Introduction to Image f…

Coursera自动驾驶课程第10讲:Feedforward Neural Networks

在上一讲《Coursera自动驾驶课程第9讲:Visual Features Detection Description and Matching》中我们学习了如何进行图像特征检测,特征匹配以及如何构建视觉里程计来估计相机的运动。 本讲我们将学习神经网络模块,关于神经网络或深度学习网上…

守护进程和守护线程

对于JAVA而言,一般一个应用程序只有一个进程——JVM。除非在代码里面另外派生或者开启了新进程。 而线程,当然是由进程开启的。当开启该线程的进程离开时,线程也就不复存在了。 所以,对于JAVA而言,线程是完全可以由自…

Coursera自动驾驶课程第11讲:2D Object Detection

在上一讲《Coursera自动驾驶课程第10讲:Feedforward Neural Networks》中我们学习了神经网络的基础知识,包括损失函数,梯度下降,正则化,卷积网络等。 本讲我们将学习深度学习的一个重要应用:图像目标检测。…

Coursera自动驾驶课程第12讲:Semantic Segmentation

在上一讲《Coursera自动驾驶课程第11讲:2D Object Detection》我们学习了深度学习的一个重要应用:目标检测。 本讲我们将学习深度学习的另一个重要应用:语义分割。这是图片像素级的一个重要应用。 B站视频链接:https://www.bili…

多线程知识梳理(2) - 并发编程的艺术笔记

layout: post title: 《Java并发编程的艺术》笔记 categories: Java excerpt: The Art of Java Concurrency Programming. <img src"http://upload-images.jianshu.io/upload_images/658453-a94405da52987372.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240…

Coursera自动驾驶课程第13讲:Least Squares

在上一讲《Coursera自动驾驶课程第12讲&#xff1a;Semantic Segmentation》我们学习了深度学习的另一个重要应用&#xff1a;语义分割。至此&#xff0c;本课程的视觉感知模块就介绍完了。 从本讲开始&#xff0c;我们将学习一个新的模块&#xff0c;也是本课程的第三个模块&…

Coursera自动驾驶课程第14讲:Linear and Nonlinear Kalman Filters

在上一讲《Coursera自动驾驶课程第13讲&#xff1a;Least Squares》我们学习了最小二乘法相关知识。 本讲我们将学习20世纪最著名的一个算法&#xff1a;卡尔曼滤波。具体包括线性卡尔曼滤波&#xff08;KF&#xff09;&#xff0c;扩展卡尔曼滤波(EKF)&#xff0c;误差状态卡…

详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection

本文介绍一篇两阶段的3D目标检测网络&#xff1a;Voxel R-CNN&#xff0c;论文已收录于AAAI 2021。 这里重点是理解本文提出的 Voxel RoI pooling。 论文链接为&#xff1a;https://arxiv.org/pdf/2012.15712.pdf 项目链接为&#xff1a;https://github.com/djiajunustc/Voxe…

java容器类1:Collection,List,ArrayList,LinkedList深入解读

1、 Iterable 与 Iterator Iterable 是个接口&#xff0c;实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符和返回值方法名描述Iterator<T>iterator()返回一个内部元素为T类型的迭代器default voidforEach(Consumer<?…

无限场景开放式仿真器 PGDrive:Improving the Generalization of End-to-End Driving through Procedural Generation

本文介绍一个拥有无限场景开放式驾驶仿真器&#xff1a;PGDrive&#xff0c;通过 Procedural Generation 技术可以生成无限多的驾驶场景&#xff0c;由香港中文大学周博磊团队开发。 论文地址&#xff1a;https://arxiv.org/pdf/2012.13681.pdf 项目地址&#xff1a;https://…

java容器类2:Map及HashMap深入解读

Java的编程过程中经常会和Map打交道&#xff0c;现在我们来一起了解一下Map的底层实现&#xff0c;其中的思想结构对我们平时接口设计和编程也有一定借鉴作用。(以下接口分析都是以jdk1.8源码为参考依据) 1. Map An object that maps keys to values. A map cannot contain du…