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
| | | | |
各字段含义如下:
-
Base 15-00,Base 23-16,Base 31-24,Base 39-32,Base 63-56(基地址):这五个字段组成了一个48位的基地址,表示内存段的起始地址。
-
Limit 15-00,Limit 19-16(限制):这两个字段组成了一个20位的值,表示内存段的大小限制。
-
Type(类型):4位,用于表示内存段的具体类型和访问权限。例如,数据段、代码段等。
-
S(描述符类型):1位,表示段描述符是系统段(0)还是代码或数据段(1)。
-
DPL(描述符特权级别):2位,表示内存段的特权级别,范围从0(最高特权)到3(最低特权)。
-
P(存在位):1位,表示段描述符是否有效。有效时置1,无效时置0。
-
AVL(可用位):1位,系统软件可以自由使用这个位。
-
G(粒度位):1位,用于控制限制字段的单位。当G为0时,单位是字节;当G为1时,单位是4KB。
-
D(默认操作数大小):1位,用于表示32位(0)或64位(1)的操作数大小。在64位模式下,这个位通常被设置为1。
-
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
| | |
各字段含义如下:
-
Base 15-00,Base 23-16,Base 31-24(基地址):这三个字段组成了一个32位的基地址,表示内存段的起始地址。
-
Limit 15-00,Limit 19-16(限制):这两个字段组成了一个20位的值,表示内存段的大小限制。
-
Type(类型):4位,用于表示内存段的具体类型和访问权限。例如,数据段、代码段等。
-
S(描述符类型):1位,表示段描述符是系统段(0)还是代码或数据段(1)。
-
DPL(描述符特权级别):2位,表示内存段的特权级别,范围从0(最高特权)到3(最低特权)。
-
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
| | | | |
各字段含义如下:
- Segment Limit 15-00:0-15位,段大小限制的低16位。
- Base 15-00:16-31位,基地址的低16位。
- Base 23-16:32-39位,基地址的中间8位。
- Type:40-43位,表示内存段的具体类型和访问权限。例如,数据段、代码段等。
- S(描述符类型):44位,表示段描述符是系统段(0)还是代码或数据段(1)。
- DPL(描述符特权级别):45-46位,表示内存段的特权级别,范围从0(最高特权)到3(最低特权)。
- P(存在位):47位,表示段描述符是否有效。有效时置1,无效时置0。
- AVL(可用位):52位,系统软件可以自由使用这个位。
- 0:53位,保留位,通常设置为0。
- D(默认操作数大小):54位,用于表示16位(0)或32位(1)的操作数大小。
- G(粒度位):55位,用于控制限制字段的单位。当G为0时,单位是字节;当G为1时,单位是4KB。
- Limit 19-16:48-51位,段大小限制的高4位。
- Base 31-24:56-63位,基地址的高8位。
1 / 1