什么是CPU保护环?

计算机科学中, 分级保护域(英语:hierarchical protection domains),经常被叫作保护环(Protection Rings),又称环型保护(Rings Protection)、CPU环(CPU Rings),简称Rings。这是一种用来在发生故障时保护数据和功能,提升容错度,避免恶意操作 ,提升计算机安全的设计方式。工作在不同Ring中的对象对资源有不同的访问级别。Rings是从最高特权级(通常对应最小的数字)到最低特权级(最大的数字)排列的。在大多数操作系统中,Ring 0拥有最高特权,并且可以和最多的硬件直接交互(比如CPU,内存),同时内层Ring可以随便使用外层Ring的资源。
(来自维基百科)

Rings的概念最早出现于x86保护模式的设计中。现在,这些Rings通常存储于段选择子和段描述符的特权级位置上。

Ring0-2为“管理员”层级,可以做大部分事情,但是Ring1-2不能使用特权指令——例如加载描述符表的LGDTLLDT和加载任务寄存器的指令ltr以及停机指令hlt等等(Intel的初衷是让驱动存在于此Ring1-2,但现代操作系统通常将驱动也放在Ring0上)。

Ring3代表“用户模式”。如果你的当前特权级(CFL)或者请求特权级(RFL)在这个环上,那么你需要通过系统调用请求内核帮你完成一些资源利用操作,例如I/O读写。

综上,Rings的设计将用户程序和服务程序对资源的利用进行隔离。正确使用Rings可以提升资源使用的安全性。例如,某个间谍软件作为一个在Ring 3运行的用户程序,它在不通知用户的时候打开摄像头应该会被阻止,因为访问硬件需要使用被驱动程序保留的Ring 1的方法。

为什么会有负的保护环?

在现在的处理器中,大多有对虚拟化的硬件支持,例如Intel VT-x 和 AMD-V。在进行虚拟化之前,需要一些“高级管理员程序”初始化虚拟控制结构(这被称为VMCS),随后定义虚拟机并调用 vmenter 和处理 vmexit 进行虚拟化。而这些代码就工作在“Ring-1”层级。事实上,CPU并没有定义这种层级,但是考虑到每一个被虚拟化的内核都认为它们对系统有完全的控制权(Ring0),而它们又是被虚拟层所控制(对它们不可见),所以称其为“Ring-1”也是有道理的。

系统管理模式(SMM)是另一种执行特殊指令的操作模式。电脑主板上会有一些固件(例如BIOS)建立起SMM来处理系统管理中断,例如为了实现高级电源管理。当这些事件/中断发生后,操作系统(甚至是上面提到的虚拟层)都会被挂起,随后CPU进入一个特殊的地址空间处理中断。由于SMM对于操作系统和虚拟层都不可见,所以通常称其工作在“Ring-2”下。

有人可能记得去年有一个新闻:MINIX悄然成最流行系统:暗藏核弹级漏洞

Intel现代处理器都支持ME管理引擎,用来管理协调内部的诸多模块,尤其是传统芯片组整合进入之后,处理器已经差不多成了SoC(System on Chip)单芯片系统,更需要一个“协同总管CPU”,而MINIX就是这个微型CPU的操作系统。 AMD也有自己的协同处理器,称为PSP。这个CPU可以对芯片组做任何事情,即使是在系统通电但还没有启动的时候(甚至系统的启动也是它的管理范畴)。所以我们也称其工作在“Ring-3”下。

从安全的角度考虑,程序工作的Ring值越低,其行为的可见性也就越低。例如用户程序不会意识到自己是工作在一个“虚拟地址”中,而OS不会意识到自己只是多个被虚拟化出来的一个,而虚拟层不会意识到自己在工作过程中SMM已经完成了对一些中断的处理,而协同处理器对以上所有对象都是不可见的。可以想象,如果能够在Ring值更低的层级植入恶意程序,其被查杀的难度也会越高。

另外,以上说明基于x86架构,其他的架构CPU也有类似设计方式,例如ARM的user (3), supervisor (0), VMM (-1) 和TrustZone (-2)。


参考:

  1. Protection ring From Wikipedia
  2. Ring Architecture Question From Intel
  3. CPU Rings, Privilege, and Protection
  4. What is protection ring -1?
  5. 《x86汇编语言:从实模式到保护模式》

负的CPU保护环的更多相关文章

  1. linux系统负载相关的概念和度量

    系统负载有 CPU利用率 和 LoadAverage这2个概念. cpu利用率:cpu utilization,是进程(task)被内核调度进程实际分配了CPU资源后,在时间片内使用CPU进行工作运算 ...

  2. Linux下如何查看高CPU占用率线程

    转于:http://www.cnblogs.com/lidabo/p/4738113.html 目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidst ...

  3. CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  4. Linux下java获取CPU、内存、磁盘IO、网络带宽使用率

    一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得 ...

  5. 【Android测试】【第二节】性能——CPU时间片

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5143192.html 前言 第一节讲CPU的时候留下了一个 ...

  6. 转:CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  7. Ubuntu 14.10 下CPU实时监控mpstat命令详解

    简介 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查 ...

  8. Linux平台Cpu使用率的计算

    proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的 ...

  9. linux查看CPU性能及工作状态的指令

    http://www.aikaiyuan.com/9347.html http://blog.csdn.net/jk110333/article/details/8683478 http://www. ...

随机推荐

  1. 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树

    不多说,直接上干货! 首先来说一个非常形象的例子,来说明下数组和链表. 上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组. 老师说,你们每个人记住自己前面 ...

  2. pulic——功能性(自己写完测试的)

    一. 构建一个数组[“00:00”,"00:05"..."23:55"]的数组 function buildAxis(){ var ary=[]; ary.pu ...

  3. java多线程之线程组与线程池

    看这篇文章:http://blog.csdn.net/zen99t/article/details/50909099

  4. 基于 CentOS 搭建 WordPress 个人博客

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 腾讯云提供了开发者实验室帮助用户搭建 WordPress 个人博客,教程内容如下,用户可以点击开发者实验室快速上机完成实验. 准备 LNMP ...

  5. mysql用户操作

    一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...

  6. 优化代码CPU层面

    今天在看<支撑处理器的技术>,其中,讲到了CPU流水线.在指令之间,如果下一条指令,需要用到上一条指令的结果,会影响到流水线的执行.书上给出了几种解决方案,一个是在指令中间插入一下无关的指 ...

  7. 运行jsp时,报错404

    The origin server did not find a current reprsentation for the target resource or is not willing to ...

  8. 面向对象三大特性——封装(含property)

    一.封装概念 封装是面向对象的特征之一,是对象和类概念的主要特性. 封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 二.隐藏属性 在p ...

  9. 提交自己的包到 npm 中

    npm npm全称Node Package Manager,是node.js的模块依赖管理工具.使用github管理NPM包的代码,并定期提交至NPM服务器:npm官网 提交自己开发的NPM包 创建p ...

  10. 标头停止点不能位于宏或#if块中.

    使用VS2010在项目中编写C++头文件**.h时提示: PCH 警告: 标头停止点不能位于宏或#if块中 原因:vs2010的智能感知要求.h必须以非#if系列的预编译指令打头 正确方法:将所有含有 ...