保护模式初步理解
来源:互联网 发布:电玩巴士淘宝正吗 编辑:程序博客网 时间: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。
总的来说,特权级跳转是比较麻烦的, 牵扯的概念比较多。把这个弄明白了,基本上就入门了。
与实模式一样,保护模式中内存也被逻辑上分成了一个个具有相应功能的段,比如代码段,数据段,栈段等。 但是保护模式中,每个段的“个性“更鲜明。
我们知道,在实模式中,所有内存都是可读、可写、可访问的,你哪天看哪块内存不爽了, 轻轻松松就可以把他里面的东西搞乱,非常的不安全。 但在保护模式中,每个段在定义的时候就被赋予了段基址、段长度、段类别(代码段/数据段/...)、特权级等属性(这些属性被放在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
- 保护模式初步理解
- 保护模式初步理解
- 保护模式初步
- 初步理解设计模式
- 设计模式初步理解
- 学习笔记--保护模式理论初步(一)
- 学习笔记--保护模式理论初步(二)
- 保护模式下pmtest1.asm的理解
- 笔记:装饰者模式的初步理解
- 我对MVP模式的初步理解
- 实地址模式和保护模式的理解
- 设计模式初步理解、23种基本设计模式
- 我对保护模式下CPL,DPL,RPL 的理解
- 我对保护模式的寻址方式的理解
- 理解在保护模式下Internet Explorer的工作方式
- 自己对保护模式下的描述符的理解
- 对Linux内存地址转换、保护模式的理解
- 保护模式
- hdu5862树状数组 离散化
- Android 开发中的日常积累
- 安装Appium Client(4)
- 热更新_生成版本比较文本
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- 保护模式初步理解
- Convert .hdf5 to .jpg with Matlab
- Android Studio修改Log信息颜色
- WOW制作小地图
- linux kernel的开始
- HDU 3182 Hamburger Magi(状压DP)
- ubuntu 10.10 移植SKIA
- ubuntu 10.11 启动frambuffer
- 在Linux控制台下显示JPEG图像