- 论坛徽章:
- 0
|
内核堆栈和硬件上下文切换通过switch_to来实现,真正切换的动作在__switch_to里
硬件上下文保存在thread_info的cpu_context数据结构里,__switch_to最主要的工作,就是将当前寄存器值保存到prev对应的数据结构里,并将next里的值load到寄存器中,这样完成硬件上下文的切换
相关代码精简如下:- ENTRY(__switch_to)
- // 以下完成硬件上下文保存到prev中
- add ip, r1, #TI_CPU_SAVE
- ldr r3, [r2, #TI_TP_VALUE]
- ARM( stmia ip!, {r4 - sl, fp, sp, lr} ) @ Store most regs on stack
- THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack
- THUMB( str sp, [ip], #4 )
- THUMB( str lr, [ip], #4 )
- ...
- // 以下完成将next的硬件上下文load到寄存器里
- add r4, r2, #TI_CPU_SAVE
- THUMB( mov ip, r4 )
- mov r0, r5
- ARM( ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previously
- THUMB( ldmia ip!, {r4 - sl, fp} ) @ Load all regs saved previously
- THUMB( ldr sp, [ip], #4 )
- THUMB( ldr pc, [ip] )
- ENDPROC(__switch_to)
复制代码 |
|