10

我读了一篇关于 GDT(全局描述符表)的教程,它将 GDT 定义为“为内存的某些部分定义基本访问权限的那个”。这意味着 GDT 用于内存保护。

它是否执行上述以外的任何其他任务?

在操作系统中实现 GDT 是必须的吗?

简而言之,如果有人能以易于理解的方式详细说明 GDT,那就更好了。

谢谢

4

2 回答 2

33

所有图像均取自Intel Manual 3A, §5.1
有关更多详细信息,OP 应阅读该手册,为了简洁起见,我将在这里仅公开一些简化的概念,并避免仅提供链接的答案。


顾名思义,全局描述符表是一组描述符,可用于指定和定义系统范围的资源(因此描述这些资源)。

资源通常是连续内存的区域,但也有其他类型的非常重要的资源。

描述符的分类是

Descriptors
    Non system descriptors

        Code segment descriptor
        Data segment descriptor
        Stack segment descriptor (Alias of the previous)

    System descriptors

        System segment descriptors

            LDT segment descriptor
            TSS segment descriptor

        Gate descriptors
            Call gate descriptor
            Interrupt gate descriptor
            Trap gate descriptor
            Task gate descriptor

除了GDT之外,还有另一个表,即本地描述符表,它描述了操作系统仅对特定上下文可用的资源。

描述符由其表(GDTLDT)及其在表中的位置(即其索引)来标识。

这样的索引被写入特定的寄存器,称为选择器寄存器(以前称为段寄存器)。
每条隐式或显式访问内存的指令都使用其中一个选择器。

xor eax, eax     ;eax is zero
xor esp, esp     ;esp is zero
xor ebx, ebx     ;ebx is zero

mov ecx, DWORD [eax]      ;Use DS selector (implicit)
mov ecx, DWORD [esp]      ;Use SS selector (implicit)
mov ecx, DWORD [fs:ebx]   ;Use FS selector (explicit)

所有这些指令都读取逻辑地址0,但 CPU 使用描述符来计算新地址,称为线性地址并执行安全检查。
所以这三个指令最终可能会读取完全不同的地址。

每个选择器还指定执行操作时应使用的权限。
选择cs器很特殊,因为它不能再用 a 改变(实际上已经有一段时间了),mov而只能用分支指令(jmp, ret, call, ...)。
它的目的不仅是在获取代码时使用,它还拥有代码特权级别。
CPU 使用此特权级别来检查是否可以访问资源(使用请求的特权),检查并不总是微不足道的。

正如您将看到的,每个描述符都有一个DPL字段来设置其特权级别。
所以它们是一种保护形式。

非系统描述符

非系统描述符用于定义旨在存储代码或数据及其属性的内存区域。

非系统描述符

如您所见,这种描述符的目的是指定一个内存区域并为其附加一些属性。
特别是基地址,限制(大小),访问它所需的特权(DPL字段,检查实际上比这更多),代码的大小(仅代码),是否允许读/写等等上。

长模式(64 位)改变了属性的解释方式,请注意这一点。

系统描述符

操作系统使用系统描述符来控制用户模式程序。

系统段描述符

这些描述符定义了用于存储LDT的内存区域和另一个称为Task State Segment的结构(Intel 提供的一种用于缓解任务切换的机制)。
系统上可以有多个这些结构,选择的结构由ldtr(LDT 寄存器)和tsr(TS 寄存器)寄存器指示。

系统段描述符

门描述符

这些用于将控制权转移到其他(或多或少特权)代码。

呼叫门

呼叫门

如果您查看图片,您会发现调用门本质上是一个元描述符,它指定了一个选择器和该描述符指定的区域的偏移量以及权限。
它用于将控制权传递给特权例程。

call fs:0badbabeh

假设fs持有门的索引,CPU 根本不会使用直接地址0badbabeh,而是使用门本身的信息。

中断和陷阱门

这些与中断一起使用,两者的区别在于前者清除if标志,后者不清除。

它们与呼叫门非常相似。

中断和陷阱门

这些描述符实际上被放置在另一个表中,通常是中断描述符表
这个另一个表不是用选择器索引的,而是用中断号索引的。
如果我没记错的话,它们也可以放在GDT / LDT中并像其他门一样使用。

任务门可用于执行任务切换。

任务门

任务门

这些类似于呼叫门,但将控制权转移到新任务(任务切换)。

有些资源不是简单的内存区域,它们可以是

于 2016-05-31T21:58:26.543 回答
-5

对于你的问题,我给你两个答案:

答案 #1:在 64 位 Intel 中,全局描述符表没有任何用处。

答案 #2:在 16 位 Intel 中,全局描述符表包含系统上所有进程共享的对象的描述符。本地描述符表对各个进程使用的那些表执行相同的操作。可能有多个 LDT(每个进程一个),但只有一个 GDT 由所有进程共享(尽管理论上一个可以为不同进程更改 GDT)。

在 32 位 Intel 中,需要 GDT 和 LDT 在 32 位系统中运行旧版 16 位代码。

除非您需要处理 16 位应用程序,否则了解 GDT 和 LDT 与学习如何操作打卡机一样有用。

于 2016-06-01T00:50:33.893 回答