x86架构下的GDT表的结构

x86下GDT 64位分别代表什么?

在x86体系结构下,GDT(全局描述符表,Global Descriptor Table)是用于存储段描述符(Segment Descriptor)的一种数据结构。段描述符用于定义内存段的基地址、限制以及一些属性。在64位模式下,GDT中的每个段描述符占用64位(8字节)。

一个64位的段描述符(Segment Descriptor)结构如下:

63-56 | 55-52 | 51-48 | 47-44 | 43-40 | 39-32 | 31-24 | 23-16 | 15-08 | 07-00
-----------------------------------------------------------------------------
                |            |            |            |            |
   Base 63-56   |   Flags    |  Limit 19-16 |  Base 39-24 | Base 23-16 |
                |            |            |            |            |
                |   AVL  G  D | P  DPL  S  Type|  Base 31-24 | Base 15-00
                |            |            |            |            |

各字段含义如下:

  1. Base 15-00,Base 23-16,Base 31-24,Base 39-32,Base 63-56(基地址):这五个字段组成了一个48位的基地址,表示内存段的起始地址。

  2. Limit 15-00,Limit 19-16(限制):这两个字段组成了一个20位的值,表示内存段的大小限制。

  3. Type(类型):4位,用于表示内存段的具体类型和访问权限。例如,数据段、代码段等。

  4. S(描述符类型):1位,表示段描述符是系统段(0)还是代码或数据段(1)。

  5. DPL(描述符特权级别):2位,表示内存段的特权级别,范围从0(最高特权)到3(最低特权)。

  6. P(存在位):1位,表示段描述符是否有效。有效时置1,无效时置0。

  7. AVL(可用位):1位,系统软件可以自由使用这个位。

  8. G(粒度位):1位,用于控制限制字段的单位。当G为0时,单位是字节;当G为1时,单位是4KB。

  9. D(默认操作数大小):1位,用于表示32位(0)或64位(1)的操作数大小。在64位模式下,这个位通常被设置为1。

  10. Flags(标志):4位,保留位。在64位模式下,这些位通常被设置为0。

在64位模式下,GDT的主要作用是为特权级切换提供支持。由于64位模式下支持平坦内存模型,所有段基址通常被设置为0,限制被设置为最大值,这样整个线性地址空间都可以被访问。

1 / 1

Base 15-00,Base 23-16,Base 31-24,Base 39-32,Base 63-56(基地址)是从低到高吗?能举例说明吗?

1 / 1

是的,Base 15-00,Base 23-16,Base 31-24,Base 39-32,Base 63-56(基地址)是从低到高排列的。这些字段组成了一个48位的基地址,表示内存段的起始地址。我们可以通过将这些字段拼接起来,从低位到高位,以形成完整的基地址。

举个例子:

假设我们有以下GDT段描述符(以16进制表示):

00 CF 9A 00 00 00 00 FF

这个64位的段描述符可以分解为:

yaml

Base 15-00: 00 00
Base 23-16: 00
Base 31-24: 00
Base 39-32: 00
Base 63-56: 00

将这些字段从低到高拼接起来,得到基地址:

yaml

0000 0000 0000 0000

因此,这个内存段的基地址为0x0000_0000_0000_0000。

请注意,这个例子中的内存段是一个典型的64位平坦内存模型,所有段的基地址通常被设置为0。

1 / 1

我问的是x86架构下的GDT

1 / 1

抱歉我之前的回答有误,我将为您解释x86架构下的GDT。在x86架构(32位)下,GDT(全局描述符表,Global Descriptor Table)仍然用于存储段描述符。在32位模式下,GDT中的每个段描述符占用64位(8字节)。

一个32位的段描述符(Segment Descriptor)结构如下:

47-40 | 39-32 | 31-24 | 23-16 | 15-08 | 07-00
-------------------------------------------
            |            |            |
 Base 31-24 | Base 23-16 | Base 15-00 |
            |            |            |
   Limit 19-16 |  P  DPL  S  Type  | Limit 15-00
            |            |            |

各字段含义如下:

  1. Base 15-00,Base 23-16,Base 31-24(基地址):这三个字段组成了一个32位的基地址,表示内存段的起始地址。

  2. Limit 15-00,Limit 19-16(限制):这两个字段组成了一个20位的值,表示内存段的大小限制。

  3. Type(类型):4位,用于表示内存段的具体类型和访问权限。例如,数据段、代码段等。

  4. S(描述符类型):1位,表示段描述符是系统段(0)还是代码或数据段(1)。

  5. DPL(描述符特权级别):2位,表示内存段的特权级别,范围从0(最高特权)到3(最低特权)。

  6. P(存在位):1位,表示段描述符是否有效。有效时置1,无效时置0。

我们可以从低到高将这些字段拼接起来,以形成完整的基地址。举个例子:

假设我们有以下GDT段描述符(以16进制表示):

00 CF 92 00 00 00 00 FF

这个64位的段描述符可以分解为:

yaml

Base 15-00: 00 00
Base 23-16: 00
Base 31-24: 00

将这些字段从低到高拼接起来,得到基地址:

yaml

0000 0000 0000

因此,这个内存段的基地址为0x00000000。请注意,在x86平坦内存模型中,所有段的基地址通常被设置为0。

1 / 1

请分别写出x86架构下GDT表中每一位对应的是什么 0-15:segment limit低16位 16-31:base 0-15 32 - 39:base 16-23 40 - 43:type

1 / 1

在x86架构(32位)下,GDT(全局描述符表,Global Descriptor Table)中的段描述符占用64位(8字节)。以下是各个字段的详细信息:

markdown

63 - 56 | 55 - 52 | 51 - 48 | 47 - 40 | 39 - 32 | 31 - 24 | 23 - 16 | 15 - 00
-----------------------------------------------------------------------------
                |            |            |            |            |
   Base 31-24   |   Flags    |  Limit 19-16 |  Base 23-16 | Base 15-00 |
                |            |            |            |            |
                |  G  D 0  AVL | P  DPL  S  Type|  Segment Limit 15-00
                |            |            |            |            |

各字段含义如下:

  1. Segment Limit 15-00:0-15位,段大小限制的低16位。
  2. Base 15-00:16-31位,基地址的低16位。
  3. Base 23-16:32-39位,基地址的中间8位。
  4. Type:40-43位,表示内存段的具体类型和访问权限。例如,数据段、代码段等。
  5. S(描述符类型):44位,表示段描述符是系统段(0)还是代码或数据段(1)。
  6. DPL(描述符特权级别):45-46位,表示内存段的特权级别,范围从0(最高特权)到3(最低特权)。
  7. P(存在位):47位,表示段描述符是否有效。有效时置1,无效时置0。
  8. AVL(可用位):52位,系统软件可以自由使用这个位。
  9. 0:53位,保留位,通常设置为0。
  10. D(默认操作数大小):54位,用于表示16位(0)或32位(1)的操作数大小。
  11. G(粒度位):55位,用于控制限制字段的单位。当G为0时,单位是字节;当G为1时,单位是4KB。
  12. Limit 19-16:48-51位,段大小限制的高4位。
  13. Base 31-24:56-63位,基地址的高8位。

1 / 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDT(全局描述符)和IDT(描述符)是操作系统用于管理内存和断的重要数据结构GDT是一个,用于存储所有内存描述符描述符包含了的基地址、的长度、访问权限等信息。在x86体系结构的保护模式下,所有的内存访问都必须通过寄存器来实现。当CPU执行一条访存指令时,它会把寄存器的值当做描述符的索引,在GDT找到对应的描述符,从而确定要访问的内存地址的范围和访问权限。因此,初始化GDT是操作系统启动时的必要步骤。 IDT是另一个,用于存储所有断和异常处理程序的描述符。当CPU收到一个断请求或异常时,它会从IDT找到对应的描述符,从而确定要执行的断或异常处理程序的地址。因此,初始化IDT也是操作系统启动时的必要步骤。 GDT和IDT的初始化大致可以分为以下几个步骤: 1.创建并填充GDT和IDT的项,每个项对应一个内存断处理程序。 2.创建并填充GDTR(GDT寄存器)和IDTR(IDT寄存器),这两个寄存器分别存储GDT和IDT的地址和大小信息。 3.使用LGDT和LIDT指令将GDTR和IDTR的值加载到CPU,从而告诉CPU如何寻找GDT和IDT。 需要注意的是,为了保证安全性,GDT和IDT通常被放置在内核态的固定位置,并且只有内核态的代码才能够修改它们。此外,为了简化实现,现代操作系统通常会使用一些预定义的GDT和IDT项,而不是每次都手动填充项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值