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 2024-07-28 17:32  Dylaris  阅读(86)  评论(0)    收藏  举报