操作系统学习(九) 、访问数据段时的特权级检查

为了访问数据段中的操作数,数据段的段选择符必须被加载进数据段寄存器(DS,ES,FS或GS)或堆栈段寄存器(SS)中。可以使用指令MOV、POP、LDS、LES、LFS、lGS和LSS来加载段寄存器。

在把一个段选择符加载进段寄存器之前,处理器会进行特权级检查,它会把当前运行程序或任务的CPL、段选择符的RPL和段描述符的DPL进行比较。只有当段的DPL数值大于或等于CPL和RPL时,处理器才会把选择符加载进段寄存器中。否则就会产生一个一般保护异常,并且不加载段选择符。

访问数据段时的特权级检查:

可知一个程序或任务可寻址的区域随着其CPL改变而变化。当CPL是0时,此时所有特权级是的数据段都可被访问;当CPL是1时,只有在特权级1到3的数据段可被访问;当CPL是3时,只有处于特权级3的数据段可被访问。

另外,有可能会把数据段保存在代码段中。例如,当代码和数据是在ROM中时。因此,有些时候我们会需要访问代码段中的数据。此时我们可以使用以下方法来访问代码段中的数据:

  1. 把非一致可读代码段的选择符加载进一个数据段寄存器中。
  2. 把一致可读代码段的选择符加载进一个数据段寄存器中。
  3. 使用代码段覆盖前缀(CS)来读取一个选择符已经在CS寄存器中的可读代码段。

访问数据段的相同规则也使用与方法1。方法2则总是有效的,因为一致代码段的特权级等同于CPL,而不管代码段的DPL。方法三也总是有效的,因为CS寄存器的选择的代码段的DPL与CPL相同。

当使用堆栈段选择符加载SS寄存器时也会执行特权级检查。这里与堆栈段相关的所有特权级必须与CPL匹配,也即,CPL、堆栈段选择符RPL以及堆栈段描述符的DPL都必须相同。如果RPL或DPL与CPL不同,处理器就会产生一个一般保护异常。

原文地址:https://www.cnblogs.com/ay-a/p/9101935.html

时间: 2024-10-12 09:22:57

操作系统学习(九) 、访问数据段时的特权级检查的相关文章

操作系统学习(五) 、代码段和数据段描述符

一.代码段和数据段描述符格式 段描述符通用格式如下所示: 代码段和数据段描述符中各个位的含义如下所示: 二.代码段和数据段描述符类型 当段描述符中S标志位(描述符类型)被置位,则该描述符用于代码段或数据段.此时类型字段中最高比特位(第二个双字的位11)用于确定是数据段描述符(复位)还是代码段描述符(置位). 代码段和数据段描述符类型如下所示: 对于数据段描述符,类型字段的低3位(位8,9,10)分别用于表示已访问A,可写W,和扩展方向E,根据可写比特位W的设置,一个数据段可以是只读的,也可以是可

操作系统中的特权级检查

这里涉及到的几个概念:DPL.RPL.CPL DPL:存在于段描述符中,描述访问此段的最低特权级,即访问此段的进程CPL和RPL必须大于等于此段的DPL RPL:存在于段选择符中的最低两位,成为请求特权级即进程的请求权限,这个可以由程序员自己设置但是其功能受到CPL的制约 CPL:存在于cs和ss寄存器中的最低两位,是当前执行程序或者任务的特权级. 一个段描述符的DPL为0表示只允许内核层的进程访问,为3表示允许任意进程访问. 在实模式下,由于段寄存器是16位的,地址线有20根,当时的寻址是通过

操作系统学习(十一) 、一致代码段和非一致代码段

一.概述 操作系统保护模式下把代码段分为一致代码段和非一致代码段的原因是:内核程序和用户程序要分开,内核程序不能被用户程序干扰.但是有时候用户程序也需要读取内核的某些数据,于是操作系统就从内核程序中分配一些可以供用户程序访问的段,但是不允许用户程序写入数据,用户程序访问这些段时遵循以下规则: 内核程序不知道用户程序的数据,不调用用户程序的数据,也不转移到用户程序中来 用户程序只能访问到内核的某些共享段,这些段称为一致代码段 用户程序不能访问内核不共享的段 二.一致代码段 一致代码段:简单理解就是

【从头开始写操作系统系列】一致代码段与非一致代码段

上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构.在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代码段. 首先,我们先来看几个问题: 一致代码段和非一致代码段是什么? 为什么要有一致代码段和非一致代码段? 系统提供怎样的机制来使用户程序访问内核数据? 程序如何在段与段之间跳转? 接下来,我们将讨论上述这些问题. 特权级 为了更好的理解之后的问题,我们先来讨论一个概念:特权级. 特权级是一种机制来

操作系统学习(一)、80x86保护模式内存管理

整理的不好,凑合着看吧 目录 1.内存及寻址 2.地址变换 3.分段机制 4.分页机制 5.保护 6.去到底部 一.内存及寻址 返回目录 二.地址变换 80X86 从 逻辑地址 到 物理地址 的转换:第一阶段是使用分段机制把程序的 逻辑地址变换成处理器可寻址的内存空间(称为线性地址空间)中的地址. 第二阶段使用分页机制把线性地址转换为物理地址. 在地址变换的过程中, 第一阶段的分段变换机制总是使用,第二阶段的分页机制是可选的,如果没有启用分页机制,那么分段机制产生的线性地址空间就直接映射到处理器

操作系统学习(七) 、保护机制概述

保护机制是可靠运行多任务环境所必须的.它可以用于保护各个任务免受互相之间的干扰.在软件开发的任何阶段都可以使用段级和页级保护来协助寻找和检测设计问题和错误.当程序对错误内存空间执行了一次非期望的引用,保护机制可以阻止这种操作并且报告此类事件. 保护机制可以被用于分段和分页机制.处理器寄存器的2个比特位定义了当前执行程序的特权级,称为当前特权级CPL.在分段和分页地址转换过程中,处理器将对CPL进行验证. 通过设置控制寄存器CR0的PE标志(位0)可以让处理器工作在保护模式下,从而也就开启了分段保

《一个操作系统的实现》读书笔记--第三章---不同特权级代码段之间的跳转

http://blog.csdn.net/begginghard/article/details/7262901 1.特权级 2.一致代码段和非一致代码段 3.DPL.RPL.CPL分别代表的含义,存储在什么位置,以及它们之间的关系 4.不同特权级数据段之间的访问规则 5.不同特权级代码段之间的转移 6.代码段之间的转移对堆栈的影响 7.结合pmtest5.asm来见证不同特权级代码段之间的跳转 一.特权级在IA32的分段机制下,特权级总共有4个特权级别,从高到低分别是0.1.2.3.数字越小表

Android学习笔记(四九):通过Content Provider访问数据

在上次笔记中,我们编写了自己的Provider,这次笔记,我们将通过Content Provider的Uri接口对数据进行访问,重写Android学习笔记(四二)中例子.在这里我们不在充分描述相关UI如何编写,可以到笔记(四二)中详细查看,重点讲述如何实现数据的访问. 读取信息 读取信息方式,在笔记(四七)中已经介绍,代码如下 private voidread(){     /* 通过managedQuery读取,第1参数表示URI, 第2参数表示所需读取的信息,第3个参数是限制条件,类似SQL

汇编语言——寄存器(内存访问 ds数据段寄存器,ss栈段寄存器)

在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? #  20H(2)0地址字单元中存放的字型数据是多少? # 4e20H(3)2地址字单元中存放的字节型数据是多少? # 12H(4)2地址单元中存放的字型数据是多少?    #  0012H(5)1地址字单元中存放的字型数据是多少? #