首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

386任务切换疏失

2013-06-26 
386任务切换出错本人正在练习386的任务切换机制,谢了以下这个小代码,实现的就是从ring0进入到ring3的task0

386任务切换出错
本人正在练习386的任务切换机制,谢了以下这个小代码,实现的就是从ring0进入到ring3的task0,再从task0切换到task1,但是每次从任务0切换到任务1都会报错,更灵异的事报的错说是引发了中断:interrupt():gate descriptor is not valid sys seg(vector=0x76)我仔细检查过两个人物的tss,ldt没发现什么错,但是就是运行不了,求哪位大神能看看我的代码错在哪了?


%include"pm.inc"
section .text
start:
bits 32
mov ax,10h
mov ds,ax
mov ss,ax
mov esp,systemStack
mov eax,100000h
add eax,tss0
mov [tss0Segment+2],ax
shr eax,16
mov [tss0Segment+4],al
mov [tss0Segment+7],ah
mov eax,100000h
add eax,tss1
mov [tss1Segment+2],ax
shr eax,16
mov [tss1Segment+4],al
mov [tss1Segment+7],ah
mov eax,100000h
add eax,ldt0
mov [ldt0Segment+2],ax
shr eax,16
mov [ldt0Segment+4],al
mov [ldt0Segment+7],ah
mov eax,100000h
add eax,ldt1
mov [ldt1Segment+2],ax
shr eax,16
mov [ldt1Segment+4],al
mov [ldt1Segment+7],ah
lgdt [gdtPtr]
jmp 8:next
next:



ring3:
mov ax,tss0Segment-gdt
ltr ax
mov ax,ldt0Segment-gdt
lldt ax
push ldt0data-ldt0+7
push systemStack
push ldt0code-ldt0+7
push task0
retf




section .data 
align 8
gdt:Descriptor       0,0, 0
codeSegment:Descriptor       100000h,0ffffh, DA_C + DA_32
dataSegment:Descriptor       100000h,0ffffh,DA_DRW    
videoSegment:   Descriptor      0b8000h,0ffffh, DA_DRW 
tss0Segment:Descriptor     0,103, DA_386TSS+DA_DPL3
tss1Segment:   Descriptor     0,103, DA_386TSS+DA_DPL3
ldt0Segment:Descriptor     0,67, DA_LDT+DA_DPL3
ldt1Segment:Descriptor     0,67, DA_LDT+DA_DPL3
gdtLenequ$ - gdt
times  128 dd 0
systemStack:
gdtPtr dw gdtLen-1
dd gdt+100000h
align 8

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldt0:Descriptor       0,0, 0
ldt0code:Descriptor       100000h,0ffffh, DA_C + DA_32+DA_DPL3
ldt0data:Descriptor       100000h,0ffffh,DA_DRW +DA_DPL3


tss0:
dd 0,tss0Stack,10h,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,ldt0Segment-gdt,8000000h
times 128 dd 0
tss0Stack:

ldt1:Descriptor       0,0, 0
ldt1code:Descriptor       100000h,0ffffh, DA_C + DA_32+DA_DPL3
ldt1data:Descriptor       100000h,0ffffh,DA_DRW +DA_DPL3


tss1:
dd 0,tss1Stack,10h,0,0,0,0,0,task1,200h,0,0,0,0,usrStack1,0,0,0,17h,0fh,17h,17h,17h,017h,ldt1Segment-gdt,8000000h
times 128 dd 0
tss1Stack:

task0:
mov ax,017h
mov ds,ax
mov cl,'a'
jmp tss1Segment-gdt:0
jmp task0

task1:
mov cl,'b'
jmp tss0Segment-gdt:0
jmp task1
align 8
times 128 dd 0
usrStack1:

汇编
[解决办法]
你肯定是在保护模式下把标志寄存器IP位设置了,以前也遇到过。另外有个问题请教下楼主,你进入保护模式怎么设置CR0寄存器呀?

热点排行