有关中断~
本帖最后由 catch 于 2013-12-2 21:14 编辑在以linux 0.00为例,linux是使用了硬件切换的方式,也就是说有cpu来保存和加载tsstimer_interrupt:
push %ds
pushl %edx
pushl %ecx
pushl %ebx
pushl %eax
movl $0x10, %eax
mov %ax, %ds
movb $0x20, %al
outb %al, $0x20
movl $1, %eax
cmpl %eax, current
je 1f
movl %eax, current
ljmp $TSS1_SEL, $0
jmp 2f
1:movl $0, current
ljmp $TSS0_SEL, $0
2:popl %eax
popl %ebx
popl %ecx
popl %edx
pop %ds
iret以上是0.00的时钟中断,只有在ljmp $TSS1_SEL, $0 ,才发生进程(任务)切换,这时task0的任务描述符tss0才发生变化。在这之前task0的任务描述符tss0没有任何数据,在jmp时,cpu保存了当前进程上下文到tss0中,也把下一条指令(jmp2f)的地址保存到了tss0中的eip中。并加载tss1。jmp之后,跳转到了task1,当task1发生中断(从time_interrupt开始处执行)并跳转(执行ljmp $TSS0_SEL, $0 )回来时,task0就可以从(jmp2f)继续执行了。
可能很多人认为发生中断后发生了任务切换,因为程序跳转了。其实不是,单独的程序跳转不认为是任务切换。程序不论如何跳转,只要没有任务切换,就永远还是原进程。另外,我们也可以自己保存tss0,和加载tss1,去手动切换进程。这样理解就刚深刻了。
页:
[1]