当前位置: 代码迷 >> 汇编语言 >> 386任务切换报错
  详细解决方案

386任务切换报错

热度:253   发布时间:2016-05-02 04:41:30.0
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:

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