一步步编写操作系统 55 CPL和DPL入门2

接上节。

图中第132行的jmp指令,段选择子为SELECTOR_CODE,其RPL的值为RPL0,RPL0定义在include/boot.inc中,其值为0。选择子的索引部分值为1,表示对应GDT中第1个段描述符,该描述符的DPL为0,(它是用include/boot.inc中的DESC_DPL_0定义的,图中未展示)。

在跳转之前,CS为0,其低2位RPL部分为0,也就是CPL为0,当执行跳转指令jmp dword SELECTOR_CODE:p_mode_start时,目标代码段(即第1个段描述符)的DPL为0,与当前特权级一致(处理器会根据CPL、RPL、DPL做特权级检查,此检查过程咱们在介绍完RPL时再讨论),处理器允许转移,所以新的特权级依然是0,该值保存在段寄存器CS的低2位,这就是特级级转移的粗略过程,也是进入保护模式后特权为0的来龙去脉。

说完了CPL,咱们再看看,受访者的特权标签在哪里。

在段描述符中有一个属性还为该内存标明了特权等级,这就是段描述符中的DPL字段的作用,它就是受访者的特权标签。话说,不仅只有段描述符中有DPL字段,以后所介绍的所有描述符都有DPL。

DPL,即Descriptor Privilege Level,描述符特权级,这下您清楚为什么DPL字段在段描述符中占2位的原因了吧,两位能表示4个组合,00b、01b、10b、11b,所有特权级都齐了。

计算机是人发明的,用人的思想来理解计算机原理是再合适不过的。拿校园生活举例,班长权限比班主任低,班长有权限安排学生打扫卫生,班主任有权限查看学生成绩。班长没权限查看学生成绩,但班主任有权限安排学生打扫卫生。这就是拥有高特权级的事物可以访问同级或更低特权级资源,而低特权级的事物无法访问高特权级资源的典型例子。

在计算机中也一样,DPL是段描述符所代表的内存区域的“门槛”权限,访问者能否迈过此门槛访问到本描述符所代表的资源,其特权级至少要等于这个门槛,访问者特权能否大于该门槛?这要看受访资源是代码还是数据啦。不难想像,只有具备“能动”行为的访问者才具备访问的能力,在计算机中真正的访问者是硬件cpu,而指挥cpu行为(访问谁及如何访问)的是具有可执行能力的指令代码,数据是不能访问别人的,所以我们再强调一下访问者就是代码段中的指令,这对理解当前特权级非常重要。

访问者任何时候都不允许访问比自己特权更高的资源,无论受访资源是数据还是代码。在不涉及RPL的前提下,下面咱们要分情况讨论啦。

对于受访者为数据段(段描述符中type字段中未有X可执行属性)来说:

只有访问者的权限大于等于该DPL表示的最低权限才能够继续访问,否则连这个门槛都迈不过去。比如,DPL为1的段描述符,只有特权级为0、1的访问者才有资格访问它所代表的资源,特权为2、3的访问者会被cpu拒之门外。

对于受访者为代码段(段描述符中type字段中含有X可执行属性)来说:

只有访问者的权限等于该DPL表示的最低权限才能够继续访问,即只能平级访问。任何权限大于或小于它的访问者都将被cpu拒之门外。这是为什么呢?自问自答之前先明确一个概念,对于受访者为代码段一这说法,实际上是指处理器从当前运行的代码段上转移到受访者这个目标代码段上去执行,并不是说把该目标代码段当数据一样访问,在真实物理机器上,代码段通常情况下不被当成数据来处理的,但确实可以这么做(话说虚拟机中会把代码当成数据来处理)。

咱们先说为什么比它特权级更高的代码也无法“访问”它(即转移到它上面运行)。

代码指令代表cpu的行为,低特权级的代码能做的事,高特权级代码也能做,换句话说高特权的代码不需要低特权代码的帮助,正常情况下cpu没有理由先自降等级后再去做某事。代码段是cpu执行的指令,不是数据,这里所说的“受访者为代码段”其实就是指cpu从访问者所在的段转移到该代码段上去执行。举个例子,cpu若相当于汽车,代码则相当于司机,它指挥cpu前进的方向。段的变换相当于换了司机,特权级较高的代码段相当于技术水平较高的F1车手,特权级较低的代码段相当于技术水平较低的普通司机,这辆车为了充分展示性能、活得更加精彩,它始终希望它的搭档是驾驶技术高超的F1车手,要是把搭档降级为普通司机,它可万万不能答应啊。

不过,凡事都有例外的时候,这是唯一一种处理器会从高特权降到低特权运行的情况:处理器从中断处理程序中返回到用户态的时候。

中断处理都是在0特权级下进行的,因为中断的发生多半是外部硬件发生了某种状况或发生了某种不可抗力事件而必须要通cpu导致的,所以,在中断的处理过程中需要具备访问硬件的能力,在大多数情况下只有cpu处于0特权级才能访问硬件,这是因为eflags寄存器中的IOPL位的值通常被设置为0(该位的作用就是限制访问IO端口的最低特权级),并且TSS中不存在 IO位图,有关这部分后面马上会讲到。再者,有些中断处理中需要的指令只能在0特权级下使用,这部分指令称为特权指令,所以中断发生后其处理的过程必须在0特权级下进行。用户进程是在3特权级,在运行用户程序时若发生了中断,cpu会暂停用户程序的执行,随后cpu就会自动由3特权级进入到0特权级,在0特权级下将执行用户程序时的现场环境(也就是著名的概念:上下文)保存起来(这个保存上下文的动作可以由cpu通过TSS完成,这是cpu在硬件上提供的功能,但其效率并不高,所以大多数操作系统都是自己写代码手动保存上下文环境),待中断处理完成后,cpu会恢复用户程序的执行,也就是说会回到3特权级。以后在讲了中断和用户进程时大伙儿会更清楚这一点。

现在大家知道了,除了从中断处理过程返回外,任何时候cpu都不允许从高特权级转移到低特权级。再结合之前咱们所说的大前提,访问者任何时候都不允许访问比自己特权更高的资源,代码段也是资源,只不过可以让cpu转移过去执行而已,所以,比目标代码段特权级低的访问者也会被拒绝访问目标代码段。综上所述,对于受访问者为代码段的情况,只能是平级访问。也就是说,假如当前特权级为2,只能转移到DPL为2特权级的代码段上运行,转移到0、1、3特权级都会被处理器拒绝。

不过本质上来说,代码能否运行与代码本身的特权等级并无关系,不同等级下的代码段中的机器码都是一样的,特权级只是写在描述符的DPL中,并没有写在机器码中,所以高特权级的代码并不比低特权级的代码显得“高大上”,目标段(代码段或数据段)的特权级仅仅是在被访问时由处理器检查一次,之后再无用途,所以特权级并不影响处理器执行指令。把计算机资源划分成不等级,只是让处理器知道自己正在处理的资源的“份量”有多重,必须用同样的身份来执行,不能儿戏。

如果处理器仅能平移代码段的话,另外三个特权级的代码将没有机会运行啦。如何穿过特权屏障呢?处理器又提供了多种方式用于从低特权的代码转移到高特权代码。

处理器的特权级升高之后,程序想干什么就干什么,多少都觉得有点恐怖,有没有一种好办法,即执行高特权级代码段上的指令,又不提升特权级?一种方式是利用一致性代码段。

什么是一致性代码段?早在当初介绍段描述符结构时就已经提过它了,不过确实只是提了一下而已以至于您可能完全没有印象^_^。在段描述符中,如果该段为非系统段(段描述符的S字段为0),可以用type字段中的C位来表示该段是否为一致性代码段。C为1时则表示该段是一致性代码段,C为0时则表示该段为非一致性代码段。上面所提到的代码段是非一致性代码段,所以只能平级转移。

一致性代码段也称为依从代码段,Conforming,用来实现从低特权级的代码向高特权级的代码转移。一致性代码段是指,如果自己是转移后的目标段,自己的特权级(DPL)一定要大于等于转移前的CPL,即数值上CPL>=DPL,也就是一致性代码段的DPL是权限的上限,任何在此权限之下的特权级都可以转到此代码段上执行。这是似乎很奇怪但却意料之中,奇怪的是,低特权级访问高特权级居然是可以的,而意料之中的是,这才能实现了代码转移。该关系用公式表示如下:

在数值上,CPL >=一致性代码段的DPL

一致性代码段的一大特点是,转移后的特权级不与自己的特权级(DPL)为主,而是与转移前的低特权级一致,听从、依从转移前的低特权级,这就是它称为“依从、一致”的原因。也就是说,处理器遇到目标段为一致性代码段时,并不会将CPL用该目标段的DPL替换。

大家注意啦,既然是转移到特权级更高的一致性代码段后CPL不变,这说明这种转移本身并没有提升特权级,只是可以跑到特权级更高的代码段中去执行指令,对计算机而言并未造成因特权级升高而产生潜在危险,所以在特权级检查过程中,请求者的RPL并不参与。

特权级检查是发生在访问者访问受访者的一瞬间,只检查一次,在检查过后,在该段上以后的执行过程中也不会再被检查,处理器也并不会因为执行了高特权级的代码而觉得自己了不起,在它眼里任何级别的指令都是一样的。特权级就是一个个的关卡,仅仅是进门时的检测而已,与关卡后面的代码和数据无关。这种情况类似必须要刷工卡才能进公司一样,即使不刷工卡,您的工位还是那个工位,电脑还是那个电脑,您照样还是可以使用它们,这些资源并不会有什么改变,它们与咱们是否刷工卡是无关的。所以,尽管转移到一致性代码段后CPL还保持为原来的低特权级并未提升,但也没什么好奇怪的,毕竟目的是运行目标代码段上的指令,达到目的就行了,何必在意身份呢,人家西游记里的孙悟空当初只是弼马温的时候,由于其身份卑微是无法参加王母娘娘蟠桃大会的,最后还不是一样把蟠桃吃个够,碉堡了^_^。

顺便说一句,代码段可以有一致性和非一致性之分,但所有的数据段总是非一致的,即,数据段不允许被比本数据段特权级更低的代码段访问。

按理说,把代码划分为不同等级就是为了等级变换,如果还以卑微的身份去运行高特权级的代码,似乎不够体面,人家孙悟空为了面子还号称为齐天大圣呢,其实cpu中实现特权级变换的“门路”多着呢,还有4个“门”。

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

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

相关文章

详解停车位检测算法 Vision-Based Parking-Slot Detection: A DCNN-Based Approach and a Large-Scale Benchmark

本文介绍一篇基于深度学习的停车位检测论文:DeepPS,作者同时公开了数据集ps2.0,工作很扎实,对于入门停车位检测很有帮助,论文发表在 IEEE T-IP 2018。 项目链接为:https://cslinzhang.github.io/deepps/ 0…

Monitor(管程)是什么意思?Java中Monitor(管程)的介绍

本篇文章给大家带来的内容是关于Monitor(管程)是什么意思?Java中Monitor(管程)的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 monitor的概念 管程&#x…

详解经典GPS辅助惯性导航论文 A GPS-aided Inertial Navigation System in Direct Configuration

本文介绍一篇 IMU 和 GPS 融合的惯性导航论文,重点是理解本文提出的:Dynamical constraints update、Roll and pitch updates 和 Position and heading updates。 论文链接为:https://www.sciencedirect.com/science/article/pii/S166564231…

详解停车位检测论文:Attentional Graph Neural Network for Parking-slot Detection

本文介绍一篇注意力图神经网络用于停车位检测论文,论文已收录于 RA-L2021。在之前的基于卷积神经网络的停车位检测方法中,很少考虑停车位标记点之间的关联信息,从而导致需要复杂的后处理。在本文中,作者将环视图中的标记点看作图结…

详解3D物体检测模型 SPG: Unsupervised Domain Adaptation for 3D Object Detection via Semantic Point Generation

本文对基于激光雷达的无监督域自适应3D物体检测进行了研究,论文已收录于 ICCV2021。 在Waymo Domain Adaptation dataset上,作者发现点云质量的下降是3D物件检测器性能下降的主要原因。因此论文提出了Semantic Point Generation (SPG)方法,首…

Waymo研发经理:《自动驾驶感知前沿技术介绍》

Waymo研发经理|自动驾驶感知前沿技术介绍这是Waymo研发经理(VoxelNet作者)的一个最新分享报告:《自动驾驶感知前沿技术介绍》。在这份报告里,介绍了Waymo在自动驾驶感知中五个研究方向的最新成果。 1. Overview of the autonomous…

几种常见软件过程模型的比较

瀑布模型 瀑布模型(经典生命周期)提出了软件开发的系统化的、顺序的方法。其流 程从用户需求规格说明开始,通过策划、建模、构建和部署的过程,最终提供一 个完整的软件并提供持续的技术支持。 优点: 1. 强调开发的…

两篇基于语义地图的视觉定位方案:AVP-SLAM和RoadMap

本文介绍两篇使用语义地图进行视觉定位的论文,两篇论文工程性很强,值得一学。 AVP-SLAM是一篇关于自动泊车的视觉定位方案,收录于 IROS 2020。论文链接为:https://arxiv.org/abs/2007.01813,视频链接为:ht…

【51Nod - 1270】数组的最大代价(dp,思维)

题干&#xff1a; 数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai&#xff0c;都满足1 < Ai < Bi。数组A的代价定义如下&#xff1a; &#xff08;公式表示所有两个相邻元素的差的绝对值之和&#xff09; 给出数组B&…

一步步编写操作系统 56 门、调用门与RPL序 1

小弟多次想把调用门和RPL分开单独说&#xff0c;但几次尝试都没有成功&#xff0c;我发现它们之间是紧偶合、密不可分&#xff0c;RPL的产生主要是为解决系统调用时的“越权”问题&#xff0c;系统调用的实现方式中&#xff0c;以调用门和中断门最为适合。由于以后我们将用中断…

自动驾驶纯视觉3D物体检测算法

视频链接&#xff1a;https://www.shenlanxueyuan.com/open/course/112 这是Pseudo-LiDAR作者最近做的一个分享报告&#xff1a;《Pseudo-LiDAR&#xff1a;基于相机的3D物体检测算法》。在这份报告里&#xff0c;作者主要介绍了博士期间的研究成果&#xff1a;基于深度学习的…

一步步编写操作系统 57 门、调用门与RPL序 2

接上文&#xff1a; 提供了4种门的原因是&#xff0c;它们都有各自的应用环境&#xff0c;但它们都是用来实现从低特权级的代码段转向高特权级的代码段&#xff0c;咱们这里也只讨论有关特权级的功用&#xff1a; 1.调用门 call和jmp指令后接调用门选择子为参数&#xff0c;以…

Coursera自动驾驶课程第15讲:GNSS and INS Sensing for Pose Estimation

在上一讲《Coursera自动驾驶课程第14讲&#xff1a;Linear and Nonlinear Kalman Filters》 我们学习了卡尔曼滤波相关知识&#xff0c;包括&#xff1a;线性卡尔曼滤波&#xff08;KF&#xff09;、扩展卡尔曼滤波&#xff08;EKF&#xff09;、误差卡尔曼滤波&#xff08;ES-…

详解车道线检测数据集和模型 VIL-100: A New Dataset and A Baseline Model for Video Instance Lane Detection

本文介绍一个新的车道线数据集 VIL-100 和检测模型 MMA-Net&#xff0c;论文已收录于 ICCV2021&#xff0c;重点是理解本文提出的 LGMA 模块&#xff0c;用于聚合局部和全局记忆特征。 论文链接&#xff1a;https://arxiv.org/abs/2108.08482 项目链接&#xff1a;https://gi…

七天入门图像分割(1):图像分割综述

最近在研究自动驾驶视觉语义地图构建&#xff0c;因为要使用到语义分割技术&#xff0c;趁此机会学习了百度飞桨的图像分割课程&#xff0c;课程蛮好的&#xff0c;收获也蛮大的。 课程地址&#xff1a;https://aistudio.baidu.com/aistudio/course/introduce/1767 1. 课程简要…

一步步编写操作系统 59 cpu的IO特权级1

在保护模式下&#xff0c;处理器中的“阶级”不仅体现在数据和代码的访问&#xff0c;还体现在指令中。 一方面将指令分级的原因是&#xff0c;有些指令的执行对计算机有着严重的影响&#xff0c;它们只有在0特权级下被执行&#xff0c;因此被称为特权指令&#xff08;Privile…

重读经典:《ImageNet Classification with Deep Convolutional Neural Networks》

9年后重读深度学习奠基作之一&#xff1a;AlexNet【下】【论文精读】这两天偶然间在B站看了李沐博士对AlexNet论文的重新解读&#xff0c;收获满满。AlexNet是当今深度学习浪潮奠基作之一&#xff0c;发表在2012年。在视频中&#xff0c;李沐博士主要是分享了他的三步法快速读论…

一步步编写操作系统 60 cpu的IO特权级2 什么是驱动程序

用户程序可以在由操作系统加载时通过指定整个eflags设置&#xff0c;操作系统如何设置自己的IOPL呢&#xff0c;即使内核IOPL为0也得写进去eflags寄存器中才生效。可惜的是&#xff0c;没有直接读写eflags寄存器的指令&#xff0c;不过可以通过将栈中数据弹出到eflags寄存器中来…

详解惯性导航论文 RINS-W: Robust Inertial Navigation System on Wheels

本文介绍一篇惯性导航定位论文 RINS-W&#xff0c;论文发表于 IROS2019。在本论文中作者提出了仅使用一个IMU进行长时间惯性导航的方法。方法主要包括两个部分&#xff1a; 检测器使用循环神经网络来检测IMU的运动状况&#xff0c;如零速或零横向滑移&#xff1b;使用Invarian…

一步步编写操作系统 61 任务状态段 TSS

I/O位图是位于TSS中的&#xff0c;它可以存在也可以不存在&#xff0c;它只是用来设置对某些特定端口的访问&#xff0c;没有它的话便默认为禁止访问所有端口。正是由于它可有可用&#xff0c;所以TSS的段界限TSS limit&#xff08;即实际大小-1&#xff09;并不固定。当TSS中不…