关于LDT的使用

看了书上和网上说的关于LDT的内容,觉得网上许多博客对LDT的认识都不准确,博客内容也要么是抄书上的内容,要么抄别人的博客。

LDT,也就是Local Descriptor Table,局部描述符,它描述的和GDT一样,也是一个段。这样理解,我觉得往后越学越容易误会。

我觉得不应该先说LDT,应该先说跳转入保护模式后,我们要如何执行多个任务。
假设我们现在已经进入保护模式了,我们需要在保护模式下执行一个任务,这个任务可能比较复杂,我们把它写到一个新的段里面,这个任务可能也会有自己的段描述符,这时我们需要使用LDT

比如我们在保护模式下,要跳转到一个新的段执行一段显示字符串的程序,这时我们就可以先建立一张LDT,通过LDT跳转到对应代码段执行,当执行完后,再跳转回原来的32位代码段
关于LDT的使用

现在GDT中添加一个LDT描述符,计算对应的选择子
[SECTION .gdt]
LABEL_DESC_LDT: Descriptor 0, LDT_LEN, DA_LDT

SelectorLDT equ LABEL_DESC_LDT - LABEL_GDT

在上电后16位代码段中,初始化GDT中的LDT描述符,初始化LDT中的描述符
[SECTION .s16]
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

xor eax, eax
mov ax, ds
shl eax, 4
add eax, LABEL_LDT_CODE
mov word [LABEL_LDT_CODE + 2], ax
shr eax, 16
mov byte [LABEL_LDT+CODE + 4], al
mov byte [LABEL_LDT_CODE + 7], ah

在32位保护模式代码段中,跳转入局部任务
[SECTION .s32]
mov ax, SelectorLDT
lldt ax
jmp SelectorLDTCode:0

构建LDT
[SECTION .ldt]
LABEL_LDT:
LABEL_LDT_DESC_CODE: Descriptor 0, LDTCODE_LEN, DA_C | DA_32
SelectorLDTCode equ LABEL_LDT_DESC_CODE - LABEL_LDT
LDT_LEN equ $ - LABEL_LDT - 1

创建LDT局部任务代码段
[SECTION .ldt_code32]
LABEL_LDT_CODE:
......
LDTCODE_LEN equ $ - LABEL_LDT_CODE - 1

在大家都在用的教材中,也就是于渊老师的书中是直接跳转到16位代码段,退出保护模式到时模式去了,我这里不像到实模式,我还想再保护模式再用一次LDT,用另外一个LDT的话,那就需要段间跳转了。一开始我只加用如下方式跳转:
在CODE32里面
RET_LDT:
......
在LDT_CODE里面
jmp dword SelectorCode32:RET_LDT
发现一只说CPU关闭什么的,在于老师的程序里,写的是
jmp SelectorCode16:0
跳转到的是一个新的16位的段,我这里想要跳转到一个已经存在的段的内部某个位置,则这样不行,我们只能用段内偏移的方式跳转
jmp dword SelectorCode32:(RET_LDT - LABEL_SEG_CODE32)
这样就可以跳转成功了

贴上setup代码(注意已经通过引导扇区加载软盘中的setup.bin,一下是setup.bin里面的程序)

代码链接(我发现这个博客显示有问题)

%include "pm.inc" GDT_ADDR equ LABEL_GDT + 0x9000 [SECTION .gdt] LABEL_GDT: Descriptor 0, 0, 0 LABEL_DESC_CODE32: Descriptor 0, CODE32_LEN, DA_C | DA_32 LABEL_DESC_DATA: Descriptor 0, DATA_LEN, DA_DRW LABEL_DESC_STACK: Descriptor 0, STACK_LEN, DA_DRWA | DA_32 LABEL_DESC_VIDEO: Descriptor 0xB8000, 0xFFFF, DA_DRW LABEL_DESC_LDT1: Descriptor 0, LDT1_LEN, DA_LDT LABEL_DESC_LDT2: Descriptor 0, LDT2_LEN, DA_LDT GDT_LEN equ $ - LABEL_GDT GDT_PTR dw GDT_LEN - 1 ;GDT界限 dd GDT_ADDR ;GDT基址,也就是LABEL_GDT标号的位置 SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT SelectorData equ LABEL_DESC_DATA - LABEL_GDT SelectorStack equ LABEL_DESC_STACK - LABEL_GDT SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT SelectorLDT1 equ LABEL_DESC_LDT1 - LABEL_GDT SelectorLDT2 equ LABEL_DESC_LDT2 - LABEL_GDT [SECTION .data] ALIGN 32 [BITS 32] LABEL_SEG_DATA: KaitoStr db "Hello, kaito!" KaitoOffset equ KaitoStr - $$ LilyStr db "Hello, Lily. This is the kOS!" LilyOffset equ LilyStr - $$ LDT1RetStr db "Return from LDT1!" LDT1Offset equ LDT1RetStr - $$ LDT2RetStr db "Return from LDT2!" LDT2Offset equ LDT2RetStr - $$ DATA_LEN equ $ - LABEL_SEG_DATA - 1 [SECTION .stack] ALIGN 32 [BITS 32] LABEL_SEG_STACK: times 1024*2 db 0 STACK_LEN equ $ - LABEL_SEG_STACK - 1 [SECTION .s16] [BITS 16] LABEL_BEGIN: mov ax, cs mov ds, ax mov ss, ax mov es, ax mov sp, 0x9000 ;初始化32位代码段描述符 xor eax, eax mov ax, cs shl eax, 4 add eax, LABEL_SEG_CODE32 mov word [LABEL_DESC_CODE32 + 2], ax shr eax, 16 mov byte [LABEL_DESC_CODE32 + 4], al mov byte [LABEL_DESC_CODE32 + 7], ah ;初始化数据段描述符 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_SEG_DATA mov word [LABEL_DESC_DATA + 2], ax shr eax, 16 mov byte [LABEL_DESC_DATA + 4], al mov byte [LABEL_DESC_DATA + 7], ah ;初始化堆栈段描述符 xor eax, eax mov ax, ss shl eax, 4 add eax, LABEL_SEG_STACK mov word [LABEL_DESC_STACK + 2], ax shr eax, 16 mov byte [LABEL_DESC_STACK + 4], al mov byte [LABEL_DESC_STACK + 7], ah ;初始化LDT1描述符 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_LDT1 mov word [LABEL_DESC_LDT1 + 2], ax shr eax, 16 mov byte [LABEL_DESC_LDT1 + 4], al mov byte [LABEL_DESC_LDT1 + 7], ah ;初始化LDT1中的描述符 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_LDT1_CODE mov word [LABEL_LDT1_DESC_CODE + 2], ax shr eax, 16 mov byte [LABEL_LDT1_DESC_CODE + 4], al mov byte [LABEL_LDT1_DESC_CODE + 7], ah ;初始化LDT2描述符 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_LDT2 mov word [LABEL_DESC_LDT2 + 2], ax shr eax, 16 mov byte [LABEL_DESC_LDT2 + 4], al mov byte [LABEL_DESC_LDT2 + 7], ah ;初始化LDT2中的描述符 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_LDT2_CODE mov word [LABEL_LDT2_DESC_CODE + 2], ax shr eax, 16 mov byte [LABEL_LDT2_DESC_CODE + 4], al mov byte [LABEL_LDT2_DESC_CODE + 7], ah xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_GDT mov dword [GDT_PTR + 2], eax lgdt [GDT_PTR] cli in al, 0x92 or al, 00000010b out 0x92, al mov eax, cr0 or eax, 1 mov cr0, eax jmp dword SelectorCode32:0 [SECTION .s32] ALIGN 32 [BITS 32] LABEL_SEG_CODE32: mov eax, SelectorData mov ds, eax mov eax, SelectorStack mov ss, eax mov eax, SelectorVideo mov gs, eax mov esp, 0x9000 mov ah, 0x0C mov edi, (80 * 5 + 1) * 2 mov esi, LilyOffset cld k_display: lodsb mov [gs:edi], ax add edi, 2 sub al, '!' jnz k_display mov ax, SelectorLDT1 lldt ax jmp SelectorLDT1Code:0 LDT1_RET: mov eax, SelectorVideo mov gs, eax mov ah, 0x0D mov edi, (80 * 7 + 1) * 2 mov esi, LDT1Offset cld ldt1_display: lodsb mov [gs:edi], ax add edi, 2 sub al, '!' jnz ldt1_display mov ax, SelectorLDT2 lldt ax jmp SelectorLDT2Code:0 LDT2_RET: mov eax, SelectorVideo mov gs, eax mov ah, 0x0E mov edi, (80 * 9 + 1) * 2 mov esi, LDT2Offset cld ldt2_display: lodsb mov [gs:edi], ax add edi, 2 sub al, '!' jnz ldt2_display jmp $ CODE32_LEN equ $ - LABEL_SEG_CODE32 - 1 [SECTION .ldt] ALIGN 32 LABEL_LDT1: LABEL_LDT1_DESC_CODE: Descriptor 0, LDT1_CODE_LEN, DA_C | DA_32 LDT1_LEN equ $ - LABEL_LDT1 - 1 SelectorLDT1Code equ LABEL_LDT1_DESC_CODE - LABEL_LDT1 + SA_TIL [SECTION .ldt1_code] ALIGN 32 [BITS 32] LABEL_LDT1_CODE: mov ax, SelectorVideo mov gs, ax mov ah, 0x0A mov al, '!' mov edi, (80 * 6 + 4) * 2 mov [gs:edi], ax jmp dword SelectorCode32:(LDT1_RET - LABEL_SEG_CODE32) ; jmp $ LDT1_CODE_LEN equ $ - LABEL_LDT1_CODE - 1 [SECTION .2dt] ALIGN 32 LABEL_LDT2: LABEL_LDT2_DESC_CODE: Descriptor 0, LDT2_CODE_LEN, DA_C | DA_32 LDT2_LEN equ $ - LABEL_LDT2 - 1 SelectorLDT2Code equ LABEL_LDT2_DESC_CODE - LABEL_LDT2 + SA_TIL [SECTION .ldt2_code] ALIGN 32 [BITS 32] LABEL_LDT2_CODE: mov ax, SelectorVideo mov gs, ax mov ah, 0x0A mov al, '?' mov edi, (80 * 8 + 4) * 2 mov [gs:edi], ax jmp dword SelectorCode32:(LDT2_RET - LABEL_SEG_CODE32) ; jmp $ LDT2_CODE_LEN equ $ - LABEL_LDT2_CODE - 1

代码链接(我发现这个博客显示有问题)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值