保护模式初步理解

来源:互联网 发布:电玩巴士淘宝正吗 编辑:程序博客网 时间:2024/05/12 12:44
保护模式初步理解
与实模式一样,保护模式中内存也被逻辑上分成了一个个具有相应功能的段,比如代码段,数据段,栈段等。 但是保护模式中,每个段的“个性“更鲜明。

我们知道,在实模式中,所有内存都是可读、可写、可访问的,你哪天看哪块内存不爽了, 轻轻松松就可以把他里面的东西搞乱,非常的不安全。 但在保护模式中,每个段在定义的时候就被赋予了段基址、段长度、段类别(代码段/数据段/...)、特权级等属性(这些属性被放在8个字节中,我们称之为描述符)。任何程序想访问其他段、以何种方式访问(读/写/执行),都需要校验通过才被允许。比如,我是一个可执行的代码段, 如果其他程序想修改它里面的内容,那是不被允许的。 这样,cpu通过一些类似的限制,最大限度的保护了程序的安全。

保护模式中比较重要的一个保护方式就是特权级。 所有段被划分为4个特权级(0~3),其中0最高,3最低。 较为核心的数据和代码,被放在高特权级层次中,其他的被放在低特权级中。通过这种层次的划分,可以有效的避免低优先级任务在不被允许的情况下访问高优先级段。 

所有段通常只在自己相同的特权级中运行, 但也难免有不同特权级之间的跳转,所以cpu提供了一套比较严密的特权级跳转机制。在正式介绍跳转规则之前,我想先讲一下cpu是如何检查一个跳转是否合法。 我们知道,无论是在实模式还是在保护模式中,CS,EIP都是用来保存下一条指令的地址的,不同的是在保护模式中,CS中既存放了当前代码段基址索引(3~15位存放的是当前代码段描述符在GDT中的索引),又存放了当前程序的优先级(CPL)。在试图跳转时,cpu将CPL与目标段DPL及RPL进行对比校验,如果校验成功, 就将目标段选择子加载到CS中, 并以一定规则修改CPL, 随后进入目标段运行。

对了,还要介绍一个东西:代码段类型。 代码段被分为一致代码段和非一致代码段。可以这样理解它们:
1.内核中的绝大多数代码对上层都是透明且不可访问的, 这些代码可以理解为非一致代码段, 是被严格保护起来的, 只能被相同特权级的其他段访问。
2.同时,内核也需要与上层进行交互, 所以提供了有限的代码允许符合条件的上层进行访问,这些代码就可以理解为一致代码段。

其实特权级转换规则并不复杂,大致可以归纳为以下几条:
1. 低优先级代码段通过调用门可以跳转至高优先级的一致代码段(非一致不被允许),且CPL不被改变。
2. 相同特权级代码段之间可以直接跳转。
3. 高特权级跳转至低特权级时,需要借助一条指令:retf,且CPL被更改为dest_descriptor.DPL和dest_selector.RPL中更大的值,即特权级被降低。
4. 不同特权级的代码段需要不同的栈,所以在特权级跳转时,同时也要切换栈段,具体参考TSS。

总的来说,特权级跳转是比较麻烦的, 牵扯的概念比较多。把这个弄明白了,基本上就入门了。
0 0