首页 > 其他 > 详细

段描述符属性分析

时间:2020-12-29 23:03:11      阅读:26      评论:0      收藏:0      [点我收藏+]

段描述符属性详细解析,学习时候,请记住:这些都是CPU的概念,并非操作系统的。

技术分享图片

段描述符属性

P位
P=1 : 该描述符有效
P=0 : 该描述符无效

S位
当 S=1 时,该描述符描述代码段或数据段,TYPE为不同值时,有以下含义,如图:
技术分享图片
A : 访问位,该段是否被访问过。每当处理器将该段选择子置入某个段寄存器时,就将该位置1.
W : 该数据段是否可写。
E : 扩展方向。通常来说,描述符的 [base, base + limit] 这段空间是可访问的,其它空间不可访问。如果 E = 1,[base, base +limit] 就变的不可访问,相反,其它空间变的可访问。所以 E 位,有反转有效空间的含义。
C : C = 1 表示一致代码段。否则C = 0 表示非一致代码段。
R : R = 1 表示该代码段可读。

当 S = 0 时,该描述会描述系统段,此时 TYPE 为不同值时,有以下含义。

TYPE    含义
0       保留
1       16位TSS段(可用)
2       LDT
3       16位TSS段(忙)
4       16位调用门
5       任务门
6       16位中断门
7       16位陷阱门
8       保留
9       32位TSS段(可用)
a       保留
b       32位TSS段(忙)
c       32位调用门
d       保留
e       32位中断门
f       32位陷阱门

D/B 位
对于代码段的影响:D/B 位会影响指令操作数大小,为 0 时操作数大小为 16位,为 1 时操作大小为 32 位。什么意思呢?比如说,执行 push 指令时,16 位操作数下,使用的堆栈指针寄存器是 SP,只有 16 位,PUSH一次 SP 的值减 2. 而 32 位操作数下,使用的堆栈指针寄存器是 ESP,PUSH 一次 ESP 的值减 4.
对于数据段的影响:该位为 0 时,段大小最大为 64 KB,该位为 1 时,段大小最大为 4GB。

段权限检查

上面提到了请求特权级(RPL),当前运行特权级(CPL),另外还有一个段描述符的特权级(DPL),三者之间的关系是:

1.数据段权限检查

(1)段描述符属性DPL,这是段描述符的特权级。它的含义是,如果你想访问我这个段,你应当具备什么样的级别。即:要求CPL >= DPL才有效,就是说如果我这个段只能在0环程序访问,那么你3环程序就不能访问。
(2)请求特权级RPL在段选择子中(不是段寄存器),它的含义是当前我想以 RPL 这个级别来请求你把这个段选择子置入段寄存器。实际上 RPL 并没有什么用。因为请求者任何时刻都可以让 RPL = 0。但是如果请求者是 CPL = 0 的程序,用 RPL = 3 的级别来请求 DPL = 0的数据段,必然会失败。即:要求RPL >= DPL才有效,就是说如果我这个段只能被CPL=0的段选择子访问,那么你RPL=3的段选择子就不能访问。
总结:
数据段权限检查,本质上就是检查能不能把段选择子代入到段寄存器。如果代入成功,表明权限检查通过。如果代入不成功,说明权限不够(CPL在数值上太大了)。

2.代码段权限检查

只有得到段描述符的同意,才允许低权限的程序跳转进去执行,这种段称为一致代码段。(要求:CPL >= DPL)
有些代码段描述符,绝对不允许低权限的程序跳转进去执行,这种段称为非一致代码段。(要求:CPL == DPL 并且 RPL <= DPL)
总结:
(1)对于一致代码段:也就是共享的段
特权级别高的程序不允许访问特权级别低的数据:核心态不允许访问用户态的数据
特权级别低的程序可以访问到特权级别高的数据,但特权级别不会改变:系统调用,用户态还是用户态
(2)对于普通代码段:也就是非一致代码段
只允许同级访问
绝对禁止不同级别的访问:核心态不允许访问用户态,用户态也不允许访问核心态
(3)直接对代码段进行JMP或者CALL的操作,无论目标是一直代码段还是非一致代码段,CPL都不会发生改变,如果要提升CPL的权限,只能通过调用门

段描述符属性分析

原文:https://blog.51cto.com/14207158/2576740

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!