鱼C论坛

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

[技术交流] 有关中断~

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

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

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

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,去手动切换进程。这样理解就刚深刻了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 17:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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