天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧系统 >> 正文

详解Linux系统内核抢占补丁的相关原理

2013-2-26不详佚名

68239">

  cmpl $0,need_resched(%ebx)

  jz restore_all #

  movl SYMBOL_NAME(irq_stat)+irq_stat_local_bh_count CPU_INDX,%ecx

  addl SYMBOL_NAME(irq_stat)+irq_stat_local_irq_count CPU_INDX,%ecx

  jnz restore_all

  incl preempt_count(%ebx)

  sti

  call SYMBOL_NAME(preempt_schedule)

  jmp ret_from_intr # 新进程返回,返回ret_from_intr恢复抢占标志后再返回

  #else

  jmp restore_all

  #endif

  ALIGN

  handle_softirq:

  #ifdef CONFIG_PREEMPT

  cli

  GET_CURRENT(%ebx)

  incl preempt_count(%ebx)

  sti

  #endif

  call SYMBOL_NAME(do_softirq)

  jmp ret_from_intr

  ALIGN

  reschedule:

  call SYMBOL_NAME(schedule) # test

  jmp ret_from_sys_call

  include/asm/hw_irq.h:

  ...

  #ifdef CONFIG_PREEMPT

  #define BUMP_CONTEX_SWITCH_LOCK \

  GET_CURRENT \

  "incl 4(%ebx)\n\t"

  #else

  #define BUMP_CONTEX_SWITCH_LOCK

  #endif

  #define SAVE_ALL \ 硬件中断保护入口现场

  "cld\n\t" \

  "pushl %es\n\t" \

  "pushl %ds\n\t" \

  "pushl %eax\n\t" \

  "pushl %ebp\n\t" \

  "pushl %edi\n\t" \

  "pushl %esi\n\t" \

  "pushl %edx\n\t" \

  "pushl %ecx\n\t" \

  "pushl %ebx\n\t" \

  "movl $" STR(__KERNEL_DS) ",%edx\n\t" \

  "movl %edx,%ds\n\t" \

  "movl %edx,%es\n\t" \

  BUMP_CONTEX_SWITCH_LOCK # 硬件中断的入口禁止内核抢占

  include/linux/spinlock.h:

  #ifdef CONFIG_PREEMPT

  #define switch_lock_count() current->preempt_count

  #define in_ctx_sw_off() (switch_lock_count().counter) 判断当前进程的抢占计数

  是否非零


本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行