catch 发表于 2013-12-2 21:12:41

有关中断~

本帖最后由 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]
查看完整版本: 有关中断~