5-特权级

来源:互联网 发布:打淘宝客服要话费吗 编辑:程序博客网 时间:2024/05/01 07:02

CPU分级

处于保护模式下的 CPU,有4种运行级别。


这里写图片描述
图1 CPU不同运行级别

围绕在最中心的那个圆心,叫 Ring 0,中文叫 0 环,这里运行特权级最高的代码。我在这里避免说这个级别运行操作系统内核,这是因为这是给设计操作系统的人看的。就目前来看,我不还不要和操作系统拉上关系,因为知识还不够。

中间的 1 环和 2 环很少使用。最外层的 3 环,是运行级别最低的。

怎样查看程序处于哪个运行级别?

打开你的 OD 程序,随便 open 一个 exe 程序,然后观察 cs 段寄存器的值。


这里写图片描述
图2 查看程序当前在哪个运行级别

可以观察到 CS 的值现在是 0x1B(剩余的80位隐藏位我们还不用关心)。然后看 0x1B 的最低 2 位进制位,这个值是 11b,换算成 10 进制数就是 3. 所以当前程序处于 3 环。

当前程序的运行级别有一个固定的名字,叫 CPL(当前特权级)。在这里 CPL = 3.

DPL

之前遗留的一个段描述符属性——DPL,这是段描述符的特权级。它的含义是,如果你(处于某个当前特权级下的程序)想访问我这个段,你应当具备什么样的级别。

比如某个政府机构,它规定了,只允许市长及其以上级别的人才能进入。这个机构要求的级别就是 DPL(=0),而市长本人的这个职称就是 CPL(=0)。倘若你一个村长(CPL=3)想进这个地方,必然会被拒绝。

RPL

RPL的值只存在于段选择子中。注意,不是段寄存器中,不是段寄存器中,不是段寄存器中。

段选择子就是一个数字,前面讲过,它有三段结构,分别是“索引-TI指示-RPL”

它的含义是当前我想以 RPL 这个级别来请求你把这个段选择子置入段寄存器。实际上 RPL 并没有什么用。因为请求者任何时刻都可以让 RPL = 0。但是如果请求者是 CPL = 0 的程序,用 RPL = 3 的级别来请求 DPL = 0的数据段,必然会失败。

这什么意思呢?举个例子:

省长以省长的身份去办事情的时候(CPL=0的程序以RPL=0的级别去请求DPL=0的数据段),肯定没什么问题。省长以平民的身份去办事情的时候(CPL=0的程序以RPL=3的级别去请求DPL=0的数据段),肯定会失败。

平民以省长的身份去办事情的时候(CPL=3的程序以RPL=0的级别去请求DPL=0的数据段),结果可想而知……失败!!!

总结

本篇中,可能难以理解的是 RPL,没关系,随着后面知识的跟进,你也会慢慢理解。

1 0
原创粉丝点击