我阅读了关于GDT(全局描述表)的教程,该教程将GDT定义为"为内存的某些部分定义基本访问权限的那个"。这意味着GDT用于记忆保护。
它是否执行除上述任务以外的任何其他任务?
在操作系统中实施GDT是否必须?
简而言之,如果有人能够以易于理解的方式详细阐述GDT,那就更好了。
由于
答案 0 :(得分:17)
所有图片均来自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 之外,还有另一个表本地描述符表,它描述了操作系统仅向特定上下文提供的资源。
描述符由其表( GDT 或 LDT )及其在表上的位置, index 标识。
这样的索引被写入特定的寄存器,称为选择寄存器(以前称为段寄存器)。 隐式或显式访问内存的每条指令都使用其中一个选择器。
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
进行更改(实际上已经有一段时间了),但只能使用分支指令(jmp
,ret
,{ {1}},......)
它的目的不仅仅是在获取代码时使用,它还拥有代码权限级别
CPU使用此权限级别来检查是否可以访问资源(具有所请求的权限),检查并不总是微不足道。
正如您将看到的,每个描述符都有一个 DPL 字段来设置其权限级别。
所以它们是保护的一种形式。
非系统描述符用于定义用于存储代码或数据及其属性的内存区域。
正如您所看到的,这种描述符的目的是指定一个内存区域并为其附加一些属性。
特别是基地址,限制(大小),访问它所需的权限( DPL 字段,检查实际上比这更多涉及),代码的大小(仅代码),如果允许读/写等等。
长模式(64位)改变了属性的解释方式,请注意这一点。
操作系统使用系统描述符来控制用户模式程序。
这些描述符定义用于存储 LDT 的内存区域和另一个名为任务状态段的结构(英特尔为缓解任务切换而提供的机制)。
系统上可以有多个这样的结构,所选择的结构由 ldtr (LDT寄存器)和 tsr (TS寄存器)寄存器指示。
这些用于将控制转移到其他(更多或更少特权)代码。
致电大门
如果查看图片,您可以看到调用门本质上是一个元描述符,它指定了一个选择器和一个偏移到该描述符指定的区域以及权限。
它用于将控制权传递给特权例程。
call
假设call fs:0badbabeh
持有门的索引,CPU根本不会使用直接地址 0badbabeh ,而是使用门本身的信息。
中断和陷阱关卡
这些用于中断,两者之间的区别在于前者清除了 if 标志,后者则没有。
它们与呼叫门非常相似。
这些描述符实际上放在另一个表中,通常是中断描述符表。 另一个表没有使用选择器索引,但带有中断号 如果我没记错的话,它们也可以放在 GDT / LDT 中,并像其他门一样使用。
任务门可用于执行任务切换。
任务门
这些就像呼叫门,但将控制转移到新任务(任务切换)。
有些资源不是简单的内存区域,它们可以是 gate
答案 1 :(得分:-5)
让我给你两个问题的答案:
答案#1:在64位英特尔中,全局描述符表没有任何用处。
答案#2:在16位Intel中,全局描述符表包含系统上所有进程共享的对象的描述符。本地描述符表对单个过程使用的那些做了相同的操作。可能有多个LDT(每个进程一个)但只有一个GDT由所有进程共享(尽管理论上可以改变不同进程的GDT)。
在32位Intel中,需要GDT和LDT才能在32位系统中运行传统的16位代码。
除非您需要处理16位应用程序,否则学习GDT和LDT与学习如何操作穿孔卡机器一样有用。