ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 系统运维 >> 一个操作系统的实现4-认识LDT

一个操作系统的实现4-认识LDT(1/3)

来源:网络整理     时间:2016-05-23     关键词:操作系统,ldt

本篇文章主要介绍了"一个操作系统的实现4-认识LDT",主要涉及到操作系统,ldt方面的内容,对于系统运维感兴趣的同学可以参考一下: 看到这里,你应该已经很了解GDT了,如果还不了解GDT。请看这篇文章:一个操作系统的实现(2)-认识保护模式,认识保护模式那篇文章的最后详细介绍了由16位寻址升...

看到这里,你应该已经很了解GDT了,如果还不了解GDT。请看这篇文章:一个操作系统的实现(2)-认识保护模式,认识保护模式那篇文章的最后详细介绍了由16位寻址升级到32位寻址而引入的GDT

LDT(Local Descriptor Table):从名字上面就可以看出来它与GDT(Gobal Descriptor Table)的区别。GDT是全局描述符表,LDT是局部描述符表(相对于GDT)。

下面仍然是从代码的角度讲解什么是LDT。主要讲解在上一节的基础上增加的代码。在文章的最后会附上所有代码。为了描述LDT,在上一节的基础上添加了如下代码:

[SECTION .gdt]
...
LABEL_DESC_LDT: Descriptor 0, LDTLen - 1, DA_LDT ; LDT
...
SelectorLDT equ LABEL_DESC_LDT -LABEL_GDT
...
[SECTION .s16]
...
; 初始化 LDT 在 GDT 中的描述符
xor eax, eax
mov ax, ds
shl eax, 4
add eax, LABEL_LDT
mov word [LABEL_DESC_LDT+2], ax
eax, 16
mov byte [LABEL_DESC_LDT+4], al
mov byte [LABEL_DESC_LDT+7], ah

; 初始化 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
...

[SECTION .s32]; 32 位代码段. 由实模式跳入.
...
; Load LDT
mov ax,SelectorLDT
lldt ax
jmp SelectorLDTCodeA:0 ; 跳入局部任务
...

; 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]

; CodeA (LDT, 32 位代码段)
[SECTION .la]
ALIGN 32
[BITS 32]
LABEL_CODE_A:
mov ax, SelectorVideo
mov gs, ax ; 视频段选择子(目的)
mov edi, (80* 12 + 0) * 2 ; 屏幕第 10 行, 第 0 列。
mov ah, 0Ch ; 0000:黑底 1100: 红字
mov al, 'L'
mov [gs:edi], ax
; 准备经由16位代码段跳回实模式
jmp SelectorCode16:0
CodeALen equ $ - LABEL_CODE_A
; END of [SECTION .la]

现在来看上面的代码。

首先,

在GDT中增加了一个描述符和描述符对应的选择子

然后,

增加了两个节,在上述代码的最后两段。分别是新的描述符表LDT代码段,这个代码段的描述符在LDT中。用来演示LDT的如何使用。

接下来看16位代码段中的初始化代码,

这里的初始化代码对描述符进行初始化。包括两个部分,一个是初始化LDT在GDT中的描述符,另一个是初始化LDT中的描述符

最后,在32位代码段中增加如下内容:

相关图片

相关文章