段描述符浅谈
描述符表中存放的是段描述符,如下图所示
段描述符基本属性
段描述符是GDT和LDT中的一个数据结构项,用于向处理器提供有关一个段的位置大小访问控制的信息状态信息,每个段描述符的长度是8个字节,含有3个主要字段
- 段基地址
- 段限长
- 段属性
基地址字段Base
描述了一个短的起始位置,由三个部分组成一共32位,段基地址可以是0~4GB范围内的任意地址(这同实模式不同,实模式下段基地址要求16字节对齐),但是为了让程序具有最佳性能,还是建议16字节对齐。
粒度G位
为0,Limit单位是字节。为1,Limit单位是4KB。
B/D位 (数据段时是B,代码段时是D)
- 为B时
- 为0,内存寻址是16位,堆栈使用SP,段的最大大小是64KB。
- 为1,内存寻址是32位,堆栈使用ESP,段的最大大小是4GB。
- 为D时
- 为0,默认值是16位的地址和16位或者8为操作数。
- 为1,默认值是32位的地址和32位或者8为操作数。
L位(21)
是64位代码段标志,保留给64位处理器使用,目前在分析32位时置零即可AVL
是软件可以使用的位,通常由操作系统使用,处理器不使用它段限长Limit
处理器会把段描述符中两个段限长字段组合成一个20位的值,并根据颗粒度标志G来知道段限长Limit值的实际含义。描述符有效位P位
为1则段描述符有效,为0则段描述符无效DPL
存在于段描述符中,描述了访问本地内存需要的权限。S与TYPE
应用程序有数据段和代码段,cpu还有系统段和门描述符,用来管理任务,异常,中断。并非所有的描述符都定义一个段,门描述符中存放着一个指向过程入口点的指针,S和Type字段表明了描述符的类型信息。
S位 | Type域 | |
---|---|---|
为1代码是一个代码段或者数据段,0是一个系统段 | 一共4位,在S位不同时,含义不同 |
当S为1时,Tpye的四位,11位为0时是数据段,1时是代码段。
-
当时数据段时,后面10,9,8位为EWA
-
当时代码段时,后面10,9,8位为CRA
- 10号位为一致性段位,0是非一致性段,1是一致性段
- 非一致代码段: 受到隔离的代码,只能在同一级别间互相访问。
- 一致性代码段: 不受隔离,允许被同等级货低等级代码调用。
- 9号位为R,为是否可读(代码段都是可执行的)
- 8号位为A,为是否已被访问
- 10号位为一致性段位,0是非一致性段,1是一致性段
参考资料:
[1]:赵炯,《Linux内核完全剖析》,机械工业出版社. 4.3.4节