Windows为何只用刀Ring 0和Ring 3?
861 10
[1 楼] duoduobear [Canon论坛版主]
10-12-3 16:01
哈.

这个直接给出答案.

Windows NT当初的设计要支持多种CPU的, 支持2级保护级别,使Windows NT的兼容性会更好. 当时的RISC CPU都是支持2级安全保护的.

据说OS/2能支持3级.

现在来看, 2级的权限保护的确不够用. 应该为第三方核心软件(包括QQ, 360等驻留的哪些可以的东西)单独留一级.
[11 楼] 光会照相 [资深泡菜]
10-12-7 00:10
原文由 原版咕咚 在2010-12-06 16:47发表

8086 没有ring 的概念,只能运行在实模式下。从 80286 引入保护模式开始,x86 族系就支持 ring0 ring1 和 ring3 了

虚拟化并不是必须用到 ring 1 ,用到它也是不得已而为之。在 intel VT-x 和 AMD-V 之前,虚拟机上要在 ring 0 才能运行的特权指令中有一些可以用 trap 捕获,但有 27 条特权指令无法用 trap 捕获,解 ......


这是个真大师,这次真学习了
[10 楼] nobi [泡菜]
10-12-6 17:05
原文由 原版咕咚 在2010-12-06 16:47发表

8086 没有ring 的概念,只能运行在实模式下。从 80286 引入保护模式开始,x86 族系就支持 ring0 ring1 和 ring3 了

虚拟化并不是必须用到 ring 1 ,用到它也是不得已而为之。在 intel VT-x 和 AMD-V 之前,虚拟机上要在 ring 0 才能运行的特权指令中有一些可以用 trap 捕获,但有 27 条特权指令无法用 trap 捕获,解 ......


提到8086就太远了,呵呵,没有保护模式当然就没有Ring。即便Xen也早已经支持VT或者AMD-V,否则就需要修改过的Guest OS。个人觉得以后硬件支持的虚拟化会是主流。
[9 楼] 原版咕咚 [资深泡菜]
10-12-6 16:47
原文由 nobi 在2010-12-06 15:39发表

最开始的x86 CPU是没有Ring -1的。这样如果Hypervisor运行在Ring 0,那么Guest OS就应该运行在Ring 1。但操作系统都是设计在Ring 0工作的(需要执行一些特权指令等)。为了能够不修改Guest OS,支持虚拟化的CPU,例如Intel VT和AMD-V 就提供了Ring 0之上的Ring -1。


8086 没有ring 的概念,只能运行在实模式下。从 80286 引入保护模式开始,x86 族系就支持 ring0 ring1 和 ring3 了

虚拟化并不是必须用到 ring 1 ,用到它也是不得已而为之。在 intel VT-x 和 AMD-V 之前,虚拟机上要在 ring 0 才能运行的特权指令中有一些可以用 trap 捕获,但有 27 条特权指令无法用 trap 捕获,解决办法就是扫描指令流,在执行到这些指令之前用设定好的指令序列替换掉它们,捕获后交给宿主机在 ring 0 处理。这种扫描和替换会带来一些性能上的开销,但有时也会出现反例,个别情况下使用 BT (二进制翻译) 虚拟化技术的的虚拟机比虚拟化之前跑在实体机上。。。速度反而提高十几倍。。。。

另外,还有一种以古代的 xen 为代表的虚拟化技术使用 hypervisor 层作为中间件,虚拟机使用修改过的 kernel ,不直接调用 ring 0 特权的指令,而是通过特定的 api 调用宿主机上 hypervisor 提供的服务,整个虚拟机完全运行在 ring 3 上,在后面提到的硬件辅助虚拟化技术开始投入实用后,这个流派慢慢演化为混合型虚拟化技术,也可以运行未经修改的 guest OS , 殊途同归了。

VT-x 和 AMD-V 使用 ring 1 给虚拟机构造一个 ring 0 , 虚拟机以为自己的特权指令在 ring 0 下运行,实际上在 ring 1 中被捕获,通过新增的 VM-EXIT 提交到宿主机/hypervisor 的 ring 0 去处理,然后用 VM-ENTER 返回到 guest 中继续它梦中的世界

看起来有了虚幻的 ring 0 和 VM-EXIT 和 VM-ENTER 进行穿梭极大方便了虚拟化,但实际上 VM-EXIT 和 VM-ENTER 来回穿梭的开销是相当高的,为了进一步提升虚拟化性能,后来就出现了 EPT 扩展页表翻译 和 VT-D (为虚拟机的设备驱动提供物理地址空间和线性地址空间的硬件翻译), 它们都是用来大幅减少 VM-EXIT 和 VM-ENTER 次数的,效果灰长显著。
[8 楼] 灵济 [老坛泡菜]
10-12-6 15:55
普及维基?

呵呵。有点意思。
[7 楼] nobi [泡菜]
10-12-6 15:39
原文由 光会照相 在2010-12-04 03:44发表


哎,我一直没弄明白,这个ring-1是hypervisor那层吧,那到底比ring-0高还是低呀。难道真如某人所说的简单话:ring-1 = ring-root?


最开始的x86 CPU是没有Ring -1的。这样如果Hypervisor运行在Ring 0,那么Guest OS就应该运行在Ring 1。但操作系统都是设计在Ring 0工作的(需要执行一些特权指令等)。为了能够不修改Guest OS,支持虚拟化的CPU,例如Intel VT和AMD-V 就提供了Ring 0之上的Ring -1。
[6 楼] 原版咕咚 [资深泡菜]
10-12-4 14:41
原文由 yejun 在2010-12-04 05:20发表
※※※※说是因为旧的硬件只支持两级。
http://en.※※※※※※※※※.org/wiki/Ring_(computer_security)#Interoperation_between_CPU_and_OS_levels_of_abstraction


维基说的很明白,因为有许多硬件平台只有两级 privilege level,m$ windows 为了兼容更多的硬件平台,所以只是用了 ring0 和 ring3

For example, the reason Windows uses only two levels (ring 0 and ring 3) is that some hardware architectures that were supported in the past (such as PowerPC or MIPS) implemented only two privilege levels.[3]

在这一段的前面,维基也解释了 x86 平台上 intel 和 amd 使用 ring1 实现先进的虚拟化功能,即intel vt-x 和 amd 的 amd-v , win server 2008 r2 就是用的这功能。
[5 楼] yejun [老坛泡菜]
10-12-4 05:20
※※※※说是因为旧的硬件只支持两级。
http://en.※※※※※※※※※.org/wiki/Ring_(computer_security)#Interoperation_between_CPU_and_OS_levels_of_abstraction
[4 楼] 光会照相 [资深泡菜]
10-12-4 03:44
原文由 原版咕咚 在2010-12-03 16:22发表
基本原理性错误

只用 ring 0 和 ring3 是古代的事了

到了 windows server 2008 R2 , m$ 在它身上集成了 Hyper-V , 这时 ring-1 也用上了



哎,我一直没弄明白,这个ring-1是hypervisor那层吧,那到底比ring-0高还是低呀。难道真如某人所说的简单话:ring-1 = ring-root?
[3 楼] 原版咕咚 [资深泡菜]
10-12-3 16:22
基本原理性错误

只用 ring 0 和 ring3 是古代的事了

到了 windows server 2008 R2 , m$ 在它身上集成了 Hyper-V , 这时 ring-1 也用上了
[2 楼] doubleelec [泡菜]
10-12-3 16:05
原来是自问自答。谢谢普及知识,呵呵。