LDT(Local Descriptor Table,局部描述符表)
- 作用:
- LDT 是每个进程或任务私有的一个描述符表,用于存储特定进程或任务所需的局部段描述符。
- 每个进程可以有自己的 LDT,用来管理私有的段,如任务私有的代码段或数据段。
- 特点:
- LDT 的描述符只能被拥有它的任务或进程访问。
- 操作系统在切换任务或进程时,可能会通过 lldt 指令加载不同的 LDT,以便让处理器访问特定任务的私有段。
GDT和LDT的关系与区别
- 关系:
- GDT 和 LDT 都是用来管理段式内存模型的描述符表。
- 区别:
- GDT 是全局的,存储系统中所有任务或进程共享的全局段描述符。由lgdt指令加载
- LDT 是每个任务或进程私有的,存储特定任务或进程私有的段描述符。由lldt指令加载
总结:GDT 是全局的,对整个系统所有进程可见;而 LDT 是每个进程私有的。
初始化LDT
- 准备 LDT 中的信息
需要注意的是:区别段选择子是LDT的还是GDT的是选择子结构中的TI位,置1表示LDT,反之位GDT,以下程序中的SA_TIL等于4,二进制就是00000100B,第三位为1,即置TI位为1
; LDT
[SECTION .ldt]
ALIGN 32
LABEL_LDT:
; 段基址 段界限 属性
LABEL_LDT_DESC_CODEA: Descriptor 0, CodeALen - 1, DA_C + DA_32 ; Code, 32 位
LDTLen equ $ - LABEL_LDT
; LDT 选择子
SelectorLDTCodeA equ LABEL_LDT_DESC_CODEA - LABEL_LDT + SA_TIL
; END of [SECTION .ldt]
- 在 GDT 中增加 LDT 的描述符和选择子
; LDT段描述符
LABEL_DESC_LDT: Descriptor 0, LDTLen - 1, DA_LDT ; LDT
; LDT段选择子
SelectorLDT equ LABEL_DESC_LDT - LABEL_GDT
- 在实模式中(16位)初始化 LDT 在 GDT 中的描述符
; 初始化 LDT 在 GDT 中的描述符
xor eax, eax
mov ax, ds
shl eax, 4
add eax, LABEL_LDT
mov word [LABEL_DESC_LDT + 2], ax
shr eax, 16
mov byte [LABEL_DESC_LDT + 4], al
mov byte [LABEL_DESC_LDT + 7], ah
- 在实模式中(16位)初始化 LDT 中的描述符
; 初始化 LDT 中的描述符
xor eax, eax
mov ax, ds
shl eax, 4
add eax, LABEL_CODE_A
mov word [LABEL_LDT_DESC_CODEA + 2], ax
shr eax, 16
mov byte [LABEL_LDT_DESC_CODEA + 4], al
mov byte [LABEL_LDT_DESC_CODEA + 7], ah
- 加载GDT(详见初始化GDT那章)
- 加载LDT(可选)------跳入局部任务
; Load LDT
mov ax, SelectorLDT
lldt ax
jmp SelectorLDTCodeA:0 ; 跳入局部任务
posted on
浙公网安备 33010602011771号