|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 catch 于 2013-12-2 21:14 编辑
在以linux 0.00为例,linux是使用了硬件切换的方式,也就是说有cpu来保存和加载tss- timer_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,去手动切换进程。这样理解就刚深刻了。
|
|