在head.s中,首先在用户态执行任务0,在第一次进入发生定时中断时,通过中断门执行中断处理程序,这时中断允许标志IF被自动置为0,即在任务0的内核态中断。当执行中断处理程序中的ljmp
TSS1SEL,
0时,进行任务切换,而tss1如下,
tss1: .long 0 /* back link */
.long krn_stk1, 0x10 /* esp0, ss0 */
.long 0, 0, 0, 0, 0 /* esp1, ss1, esp2, ss2, cr3 */
.long task1, 0x200 /* eip, eflags */
.long 0, 0, 0, 0 /* eax, ecx, edx, ebx */
.long usr_stk1, 0, 0, 0 /* esp, ebp, esi, edi */
.long 0x17,0x0f,0x17,0x17,0x17,0x17 /* es, cs, ss, ds, fs, gs */
.long LDT1_SEL, 0x8000000 /* ldt, trace bitmap */
可知eflags=0x200,IF=1,允许中断,完成任务切换后,执行任务1,此时CPU中的eflag=0x200是允许中断的,在任务1执行期间发生定时中断,禁止任务1内核态中断,执行切换到任务0的ljmp
TSS1SEL,
0指令,则返回原来任务0的中断处理程序继续执行,在中断返回时,eflags出栈,允许在任务0的用户态发生中断。如此,实现了任务0和任务1的切换。
欢迎使用CSDN-markdown编辑器
最新推荐文章于 2021-01-07 23:01:28 发布