欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

386任务切换疏失

更新时间: 2014-01-05 03:17:43 责任编辑: Author_N1

 

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
gdtLen equ $ - 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:
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:17:43
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20498/
本文WWW.DOC100.NET DOC100.NET版权所有。