assembly - 定义全局描述符表有什么用?

标签 assembly x86 operating-system kernel gdt

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

除上述以外,它还执行其他任何其他任务吗?

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

简而言之,如果有人能够以一种易于理解的方式详细介绍GDT,那将是更好的选择。

谢谢

最佳答案

所有图像均取自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之外,还有另一个表本地描述符表,该表描述了OS仅可用于特定上下文的资源。

描述符由其表(GDT或LDT)及其在表上的位置及其索引来标识。

此类索引被写入特定的寄存器中,称为选择器寄存器(以前称为段寄存器)。
每条隐式或显式访问内存的指令都使用选择器之一。
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选择器很特殊,因为它不能再用mov更改(实际上已经有一段时间了),而只能用分支指令(jmpretcall,...)更改。
它的目的不仅是在获取代码时使用,而且还具有代码特权级别。
CPU使用此特权级别来检查是否可以访问资源(具有请求的特权),检查并不总是那么简单。

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

非系统描述符

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

Non system descriptors

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

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

系统描述符

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

系统段描述符

这些描述符定义了用于存储LDT的存储区域,以及另一个称为任务状态段的结构(Intel为简化任务切换而提供的一种机制)。
系统上可以有一个以上的结构,所选择的结构由ldtr(LDT寄存器)和tsr(TS寄存器)寄存器指示。

System segment descriptors

门描述符

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

调用门

Call gate

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

假设fs拥有门的索引,则CPU根本不会使用立即地址0badbabeh,它将使用门本身的信息。

中断和陷阱门

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

它们与调用门非常相似。

Interrupt and Trap gates

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

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

任务门

Task gates

这些就像调用门,但是将控制权转移到新任务(任务切换)。

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

关于assembly - 定义全局描述符表有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554399/

相关文章:

子进程内存分配及收割子进程的目的

assembly - MOVZX缺少32位寄存器到64位寄存器

performance - 在最近的 Intel x86 上,端口 7 可以存储 AGU 处理什么类型的地址?

multithreading - 基本互斥锁和原子整数哪个更有效?

assembly - 如何反汇编movb指令

x86 - 目前哪些汇编器支持 AVX 指令集?

operating-system - 五种最常用的实时操作系统是什么?

windows - masm32 和 masm 的区别?

assembly - 将 xmm 寄存器折叠为标量

xcode - 在 XCode 4(或 Xcode 5 或 Xcode 6)中查看反汇编