上一节我们已经对linux中ram的异常处理有了一个大概流程有了一个了解。
本节我们主要来分析中断的处理流程。
正常情况下会有两种情况进入irq模式,一种是从usr模式,另一种是svc模式。
我们这里就以usr模式来分析。
__irq_usr:
usr_entry /* 保存中断上下文 */
kuser_cmpxchg_check /* 空函数 */
irq_handler /* 中断 */
get_thread_info tsk /* 获取保存当前task的地址 */
mov why, #0
b ret_to_user_from_irq
UNWIND(.fnend )
ENDPROC(__irq_usr)
__irq_svc:
svc_entry
irq_handler
#ifdef CONFIG_PREEMPT /* 没定义 */
get_thread_info tsk
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
ldr r0, [tsk, #TI_FLAGS] @ get flags
teq r8, #0 @ if preempt count != 0
movne r0, #0 @ force flags to 0
tst r0, #_TIF_NEED_RESCHED
blne svc_preempt
#endif
svc_exit r5, irq = 1 @ return fr