;kernel.s
[BITS 16]
ORG 0lgdt [GDT]
start:
mov ax,0x18
lldt ax
jmp 4:0;犯过错,写成3:0,结果13异常,cs==0
jmp start
GDT:
DW 31;犯过错,写成30,结果13号异常,index>xxxx
DW gdt,0
gdt:
DW 0,0,0,0
DW 0xffff
DW 0X0000
DW 0X9E00
DW 0X0000
DW 0Xffff;段限0xffff
DW 0X8000;基地址0x0b8000
DW 0XF20b;不可拓展可写
DW 0X0000
DW 0Xffff;0x18,ldt
DW LDT
DW 0X8200;ldt描述符有自己的格式
DW 0X0000
jmp start
LDT:
DW 0Xffff
DW TASK0
DW 0X9E00
DW 0X0000
TASK0:
mov ax,0x10
mov gs,ax
mov bl,'t'
mov [gs:((80*0+0)*2)],bl
jmp TASK0
总结:
1.向GDT中加入LDT描述符
>ldt描述符跟gdt是不一样的。ldt是系统描述符,而且type一定为2。(这个描述符跟LDT表中的描述符要注意区分)
>基地址可以用LDT符号
2.准备好LDT表
>LDT表的第一个描述符可以用
>表中的数据段,代码段和GDT的数据段,代码段没有区别
>基地址可以用TASK0符号
3.lldt
>lldt 0x18,是不允许直接接操作数的。
>如果操作数写错了,可能发生13号异常。
4.jmp
>jmp ldt选择子:0就ok。