LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1509|回复: 3

switch_to的问题, long jmp 到后TSS还会返回???

[复制链接]
发表于 2007-8-25 10:59:27 | 显示全部楼层 |阅读模式
Linux内核代码,switch_to中
跳转到Tss,也就是进行了任务切换,后面还有代码。不解中...

  1. #define switch_to(n) \
  2. {\
  3. struct {long a,b;} __tmp;   \
  4. __asm(\
  5. "cmpl %%ecx,current\n"\
  6. "je 1f\n"\
  7. "movw %%dx,%1\n"\
  8. "ljmp %0\n"\

  9. "cmpl %%ecx,last_task_used_math\n"\
  10. "jne 1f\n"\
  11. "clts\n"\
  12. "1:"\
  13. ::"m"(*&__tmp.a),"m"(*&__tmp.b),"d"(_TSS(b)),"c"((long) task[n]));\
  14. }

复制代码


也就是相当于:


  1. movl n,%ebx
  2. movl task[%ebx],%ecx
  3. cmpl %ecx,current
  4. je 1f
  5. movw %dx,__tmp.b
  6. ljmp __tmp
  7. cmpl %ecx,last_task_used_math
  8. jne 1f
  9. clts
  10. 1:
复制代码
 楼主| 发表于 2007-9-26 16:32:45 | 显示全部楼层
switch回来后,会执行jmp后的代码
回复 支持 反对

使用道具 举报

发表于 2007-10-13 12:52:25 | 显示全部楼层
因为1标号的地址被压入了被切换到的next进程的内核堆栈,然后直接jmp到__switch_to函数,该函数返回后,从堆栈弹出1的地址,这时候进程切换就完成了。
说白了,每次进程被重新唤醒起来运行,第一个运行地址就是1标号的地址。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-18 19:14:13 | 显示全部楼层
Post by home_king
因为1标号的地址被压入了被切换到的next进程的内核堆栈,然后直接jmp到__switch_to函数,该函数返回后,从堆栈弹出1的地址,这时候进程切换就完成了。
说白了,每次进程被重新唤醒起来运行,第一个运行地址就是1标号的地址。

谢谢老大,这个问题已经过验证。(我自做的系统)见intel 80386 programming manual:
jmp tss
xxx xxx #进程切换回来后将执行jmp后的第一条指令。
回复 支持 反对

使用道具 举报

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

本版积分规则

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