关于LDT的使用

来源:互联网 发布:广数980编程代码 编辑:程序博客网 时间:2024/05/21 14:09
看了书上和网上说的关于LDT的内容,觉得网上许多博客对LDT的认识都不准确,博客内容也要么是抄书上的内容,要么抄别人的博客。

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

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

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

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

SelectorLDT equLABEL_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
jmpSelectorLDTCode:0

构建LDT
[SECTION .ldt]
LABEL_LDT:
LABEL_LDT_DESC_CODE:Descriptor 0, LDTCODE_LEN, DA_C | DA_32
SelectorLDTCode equLABEL_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 dwordSelectorCode32:RET_LDT
发现一只说CPU关闭什么的,在于老师的程序里,写的是
jmpSelectorCode16:0
跳转到的是一个新的16位的段,我这里想要跳转到一个已经存在的段的内部某个位置,则这样不行,我们只能用段内偏移的方式跳转
jmp dwordSelectorCode32:(RET_LDT - LABEL_SEG_CODE32)
这样就可以跳转成功了

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

代码链接(我发现这个博客显示有问题)
http://pan.baidu.com/s/1dFtIWrJ

%include "pm.inc" GDT_ADDR equLABEL_GDT + 0x9000 [SECTION .gdt] LABEL_GDT: Descriptor 0, 0, 0LABEL_DESC_CODE32: Descriptor 0, CODE32_LEN, DA_C | DA_32LABEL_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_LDTGDT_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_GDTSelectorStack equ LABEL_DESC_STACK - LABEL_GDT SelectorVideo equLABEL_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. Thisis the kOS!" LilyOffset equ LilyStr - $$ LDT1RetStr db "Return fromLDT1!" LDT1Offset equ LDT1RetStr - $$ LDT2RetStr db "Return fromLDT2!" 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 movword [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 movbyte [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 movbyte [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_LDT1mov 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, 16mov byte [LABEL_LDT1_DESC_CODE + 4], al mov byte[LABEL_LDT1_DESC_CODE + 7], ah ;初始化LDT2描述符 xor eax, eax mov ax, dsshl eax, 4 add eax, LABEL_LDT2 mov word [LABEL_DESC_LDT2 + 2], axshr eax, 16 mov byte [LABEL_DESC_LDT2 + 4], al mov byte[LABEL_DESC_LDT2 + 7], ah ;初始化LDT2中的描述符 xor eax, eax mov ax, ds shleax, 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, 4add eax, LABEL_GDT mov dword [GDT_PTR + 2], eax lgdt [GDT_PTR] cliin al, 0x92 or al, 00000010b out 0x92, al mov eax, cr0 or eax, 1mov cr0, eax jmp dword SelectorCode32:0 [SECTION .s32] ALIGN 32[BITS 32] LABEL_SEG_CODE32: mov eax, SelectorData mov ds, eax moveax, SelectorStack mov ss, eax mov eax, SelectorVideo mov gs, eaxmov 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 jmpSelectorLDT1Code:0 LDT1_RET: mov eax, SelectorVideo mov gs, eax movah, 0x0D mov edi, (80 * 7 + 1) * 2 mov esi, LDT1Offset cldldt1_display: lodsb mov [gs:edi], ax add edi, 2 sub al, '!' jnzldt1_display mov ax, SelectorLDT2 lldt ax jmp SelectorLDT2Code:0LDT2_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 32LABEL_LDT1: LABEL_LDT1_DESC_CODE: Descriptor 0, LDT1_CODE_LEN, DA_C| DA_32 LDT1_LEN equ $ - LABEL_LDT1 - 1 SelectorLDT1Code equLABEL_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 32LABEL_LDT2: LABEL_LDT2_DESC_CODE: Descriptor 0, LDT2_CODE_LEN, DA_C| DA_32 LDT2_LEN equ $ - LABEL_LDT2 - 1 SelectorLDT2Code equLABEL_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

代码链接(我发现这个博客显示有问题)
http://pan.baidu.com/s/1dFtIWrJ
原创粉丝点击