[转载]LDT descriptor
显然,GDT(global descriptor table)是系统与所有进程共用的。相对于 LDT(local descriptor table)则是进程独享的。GPRs、selector registers、stack pointers、eflags、LDT descriptor、CR3 构成了一个进程的执行环境。
TSS segment 包含了上述几个环境资源。LDT 是进程独享的一个资源,是基于进程生命周期内该 LDT 进程外不可见的。每个进程有自己的 LDT (前提是系统使用了 LDT 机制)。
实际上,使用了 LDT 机制等于使用了 TSS 机制。TSS 机制早已被绝大多数 OS 所抛弃了。这无疑是 LDT 机制被绝大多数 OS 舍弃。然而,LDT 虽然是进程独享的,但另一方面,使得多个进程可以共享内存。通过传递同个的 LDT descriptor 就可以在多个进程中共享内存区域。如:每个进程的 TSS segment 中的 LDT descriptor 设为同一个 descriptor。
5.7.2.1、 LDT 的使用
1、LDT 的初始化
操作系统在初始化时,可以使用 LLDT 指令建立一个 LDT。 LLDT 须要 0 级权限,所以在用户进程方面不能使用 LLDT 指令建立 LDT。
用法示例:
LLDT ax /* ax 是 LDT descriptor selector*/
或:
LLDT word ptr [LDT_desc] /* 内存 [LDT_desc] 存放着 LDT descriptor selector */
很显然,这里的 LDT descripotr selector 结构应该是:
XXXXXXXXXXXXX 0 00
在 GDT 中对应的 LDT descriptor entry。
2、用户进程中的 LDT
通过 TSS 切换的进程可以在 TSS segment 中指出 LDT descriptor selector。在进程切换后,processor 会自动执行 load LDT descriptor 的动作。这个 LDT descriptor selector 结构和上述的一样的。同样要在 GDT 查找 LDT descriptor。
在这里,如果多个进程的 TSS segment 中的 LDT descriptor selector 设为同一个 selector 的话,等同于多个进程共享同一个 LDT,起共享内存作用。
5.7.2.2、 LDT descriptor 的加载
LDT descriptor 的加载模式和 TSS descriptor 的加载模式完全一样。
如同 TSS descriptor 加载到 TR 寄存器一样,LDT descriptor 被加载到 LDTR 寄存器。LDTR 寄存器与 TR 寄存器的结构也完全一致。包括:selector 域、attribute 域、limit 域以及 base 域。
情景提示:
1、实际上,segment registers、LDTR 以及 TR 的结构都是一样的。而 GDTR 与 IDTR 则是一样的。
2、segment registers、LDTR 以及 TR 的加载方式也是一样的。而 GDTR 与 IDTR 的加载方面是一样的。GDTR 与 IDTR 是需要操作系统初始化,代表 GDT 与 IDT 两个 descriptor table 结构必须要建立。