鱼C论坛

 找回密码
 立即注册
查看: 1730|回复: 0

[技术交流] 有关中断~

[复制链接]
发表于 2013-12-2 21:12:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 catch 于 2013-12-2 21:14 编辑


在以linux 0.00为例,linux是使用了硬件切换的方式,也就是说有cpu来保存和加载tss
  1. timer_interrupt:

  2. push %ds

  3. pushl %edx

  4. pushl %ecx

  5. pushl %ebx

  6. pushl %eax

  7. movl $0x10, %eax

  8. mov %ax, %ds

  9. movb $0x20, %al

  10. outb %al, $0x20

  11. movl $1, %eax

  12. cmpl %eax, current

  13. je 1f

  14. movl %eax, current

  15. ljmp $TSS1_SEL, $0

  16. jmp 2f

  17. 1:movl $0, current

  18. ljmp $TSS0_SEL, $0

  19. 2:popl %eax

  20. popl %ebx

  21. popl %ecx

  22. popl %edx

  23. pop %ds

  24. 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,去手动切换进程。这样理解就刚深刻了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表