什么是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. css3之transition、transform、animation比较

    css3动画多少都有些了解,但是对于transition.transform.animation这几个属性一直是比较模糊的,所以啊,这里做一个总结,也希望大家都可以对此有一个更好地理解.    其实, ...

  2. 【STM32学习笔记】STM32f407 使用4*4矩阵键盘

    作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明.谢谢! 写在前面: 这是本人第一次开始写博客,可能写的不是很好,也请大家谅 ...

  3. 【Iftop】实时监控流量工具

    linux基本查询流量的命令有: 1.ifconfig  只能看到当前接收和发送出去的总共的字节大小,但是不能看到网卡流量的实时发送情况 2.watch more /proc/net/dev 只有接受 ...

  4. [转]Setting the NLog database connection string in the ASP.NET Core appsettings.json

    本文转自:https://damienbod.com/2016/09/22/setting-the-nlog-database-connection-string-in-the-asp-net-cor ...

  5. git本地分支关联远程分支

    问题描述: 从远程master克隆下来以后, 在本地创建wf_dev分支, 此时执行git pull 操作出现图中问题. 这是因为:本地的wf_dev分支还没有和远程的wf_dev进行关联. 执行:  ...

  6. package.json中dependencies 和devDependencies的差异

    我们在日常开发中,经常会使用到npm安装对应的包,会经常在package.json中看到dependencies 和devDependencies 二者的区别: devDependencies:是你开 ...

  7. C# ADO.NET 面向对象

    ADO.NET跟面向对象的结合 把面向对象跟数据库连接用 在项目里面创建一个新的文件夹   名字为App_Code 在这个App_Code里面创建几个类 主要为拆分问题,标上序号,先干什么在干什么 实 ...

  8. Thrift笔记(六)--单端口 多服务

    多个服务,使用监听一个端口.先上一个demo Test.thrift namespace java com.gxf.thrift enum RequestType { SAY_HELLO, //问好 ...

  9. mardown文档的用法

    <hr>分割换行符<br>分隔符 <ul> <li></li></ul>无序标签 <ol><li>< ...

  10. IT小小鸟读书笔记2

    Part4: 一.    大学的时光真的很容易荒废,自己的实力到头来和自己的成绩单一样空虚,其实自己也是深有同感的. 二.    这个观点我十分的认同:在某个方面比别人多5%的深度,可能拿到的报酬就是 ...