段描述符浅谈

版权声明:欢迎转载,注明出处 https://blog.csdn.net/youyou519/article/details/89546725

描述符表中存放的是段描述符,如下图所示

图1-1 段描述符通用格式

图1-1 段描述符通用格式

段描述符基本属性

段描述符是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号位为E扩展位,0向上扩展,1向下扩展,向上扩展就是正常的扩展,向上扩展一段空间,扩展的空间可用,向下扩展就是向上扩展一下,除了这段,其他的都在段内,如图图1-2 向上扩展和向下扩展

      图1-2 向上扩展和向下扩展

    • 9号位为W,为是否可写(代码段可定都是可读的所以不需要这样的属性标志)
    • 8号位为A,为是否已被访问
  • 当时代码段时,后面10,9,8位为CRA

    • 10号位为一致性段位,0是非一致性段,1是一致性段
      • 非一致代码段: 受到隔离的代码,只能在同一级别间互相访问。
      • 一致性代码段: 不受隔离,允许被同等级货低等级代码调用。
    • 9号位为R,为是否可读(代码段都是可执行的)
    • 8号位为A,为是否已被访问

参考资料:

[1]:赵炯,《Linux内核完全剖析》,机械工业出版社. 4.3.4节

猜你喜欢

转载自blog.csdn.net/youyou519/article/details/89546725