📜  什么是全局描述符表(1)

📅  最后修改于: 2023-12-03 15:36:09.512000             🧑  作者: Mango

什么是全局描述符表?

全局描述符表(Global Descriptor Table,GDT)是操作系统中负责存储可用内存段的数据结构。操作系统使用GDT来保护和管理内存。GDT中的每个entry描述一个内存段的地址、大小和访问权限。

GDT结构

GDT是由若干个段描述符组成的数组。每个entry占8个字节,其中包含以下信息:

  • base - 该内存段的基址(基址是指段的起始地址)
  • limit - 该内存段的大小
  • access - 访问权限,包括读写、执行、特权级等信息
  • flags - 其他标志,包括段类型、内存粒度等信息

通常GDT中的第一个entry是空的,其他entry会映射到各种内存段上,例如代码段、数据段、栈段等。

使用GDT

在操作系统启动时,需要设置GDT来管理内存。一般来说,需要创建至少两个entry:一个用于代码段,一个用于数据段。这两个entry需要设置相应的访问权限和标志,以便操作系统能够保护不同的内存区域不被非法访问。

以下是一个使用GDT的示例代码:

gdt:
  ; 第0个entry为空
  dd 0
  dd 0
  
  ; 第1个entry用于代码段
  dw 0xffff ; limit low
  dw 0 ; base low
  db 0 ; base middle
  db 10011010b ; access
  db 11001111b ; flags (limit high, granularity)

  ; 第2个entry用于数据段
  dw 0xffff ; limit low
  dw 0 ; base low
  db 0 ; base middle
  db 10010010b ; access
  db 11001111b ; flags (limit high, granularity)

; 加载GDT到GDTR寄存器
lgdt [gdt_desc]
gdt_desc:
  dw gdt_end - gdt - 1 ; limit (界限)
  dd gdt ; base (地址)

以上代码定义了一个包含两个entry的GDT,并将其加载到了GDTR寄存器中。在实际应用中,需要根据具体情况修改GDT中的entry,以便满足不同的访问控制需求。

总结

全局描述符表是操作系统中用于管理内存的数据结构,它由一组描述符组成,每个描述符用于描述一个内存段的地址、大小和访问权限。操作系统启动时需要设置GDT,并根据实际需求修改其中的entry,以便满足不同的访问控制需求。