通过时钟中断来进行任务切换。
中断是通过 IDT任务门->GDT任务段(TSS)描述符->中断处理程序 实现
然后在GDT中安排了一个TSS描述符,并且将其对应的TSS段初始化好,任务的代码段和数据段都安排好了。
对应TSS描述符的选择子为sel_process0
任务切换的做法是,时钟中断发生时进行中断处理,然后jmp sel_process0:0
然后打开时钟中断,如果没有任何问题的话,中断会不停的发生,任务也会不停的执行,因为我只设置了一个任务。
就是为了实验任务切换成功与否,如果一个任务可以成功不断的执行,那多个任务肯定可以切换成功。
但是我遇到的问题是,第一次时钟中断可以成功的切换到任务0,但是第二次时钟中断就发生了“通用保护故障”(INT 0xD)
为了找到问题,我通过在中断中重新设置任务0的TSS描述符以及TSS段的内容来排错,发现仍然是第二次时钟中断中切换的时候发生上述错误,所以排除了任务切换后描述符和TSS会被改变的可能。
但是实在找不到其他的原因了。
我的任务0的内容是 在显存的一个位置输出ascii字符,循环++
有没有人给点提示?
------解决方案--------------------------------------------------------
没办法给出太多提示,因为你说得还不够详细。
首先,任务切换在两个任务之间进行,你的另一个任务,或者主进程是什么?
其次,利用时钟中断进行任务切换,必须注意TSS描述符的B位,以及EFLAGS的NT位。如果设置不当,一定会出问题的。
------解决方案--------------------------------------------------------
你在real pc中还是在vm中?
------解决方案--------------------------------------------------------
帮顶。