作者:justmoon999 | 来源:互联网 | 2023-05-21 17:44
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,没关系,随着后面知识的跟进,你也会慢慢理解。