什么是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. 多重if 与 switch case的区别

    多重if:可以做等值操作也可以做区间操作 switch case:只能做等值操作

  2. baidumapapi点线面的绘制已离线化

    百度API离线化 baidumapapi2.0商用是要收费的,开发者使用也要申请个Key. 有个项目要用到点线面的绘制功能,在百度的API示例中发现有这样js封装(DrawingManager_min ...

  3. HDFS基本工具类的实现

    package com.shikun.HdfsTool;import java.io.File;import java.io.IOException;import java.net.URI;impor ...

  4. vue中遇到的坑 --- 变化检测问题(数组相关)

    最近在项目中遇到了一个问题,不知道为什么,所以最后通过动手做demo实践.查文档的方式解决了,这里做一个总结. 例1 <!DOCTYPE html> <html lang=" ...

  5. vi编辑器备忘录

    1. 基本操作 G 移动到文件最后一行 nG 移动到n行 gg 移动到第一行 N[Enter] 向下移动n行 /word 向下寻找 ?word 向上寻找 n 查找下一个 N 查找上一个 0或者Home ...

  6. ife task0003学习笔记(二):JavaScript原型

    function aaa(){} aaa.prototype.bbb=function(){} var obj1=new aaa() var obj2=new aaa() obj1和obj2都有一个属 ...

  7. HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】

    理工门外的树 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %lld , %llu Java class n ...

  8. POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】

    Mayor's posters Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  9. sqlserver2008 调试存储过程

    1.创建所需要调试的存储过程,并执行一下,也就是保存好 ,我要演示的存储过程名是 “usp_Passport_GetNewDepositary” 2.找到存储过程,右键“执行存储过程”,会弹出如下的界 ...

  10. mysql中时间日期函数

    转自:mysql 中 时间和日期函数 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +- ...