异常和中断处理过程是每个体系结构和OS都要面对的重要问题,本文从硬件角度以及软件角度来分析PowerPc这个过程,文字水平有限,将就着看。
PowerPC定义了十几种异常,其中常见的如DataTLB miss, Instruction TLB miss, external input....每一个都有固定的地址(ivorn),从物理地址0x100开始.0x500是中断入口,0xe00是DTLBmiss,0xf00是itlbmiss入口.首先整体了解一下中断发生时硬件/软件处理流程,硬件会做什么,OS软件要做什么。
PowerPC 中断的硬件处理流程:(ePAPR第四章)
1. 把正在执行的指令序列下一条指令地址保存到中断寄存器SRR0(Save/RestoreRegiser 0)。
2. 把当前 MSR 的内容保存到 SRR1。
3. 把 MSR 某些比特置为 0,如MSR[SPE,WE,EE,PR,FP,FE0,FE1,IS,DS]are 0 by all interrupts.
【注】:PowerPC有两种执行模式,分别为用户模式(UserMode) 和特权模式(SupervisorMode), MSR[PR]=0 表示特权模式。Linux内核运行在特权模式,而普通程序运行在用户模式。vxWorks全部运行在特权模式。
1. 在新的 MSR 状态下,从中断向量偏移处开始指令读取和执行。
2. 外部中断处理结束时,必须通过 rfi 指令返回。
3. rfi 的执行,会把 SRR1 的内容恢复到 MSR, 并从 SRR0 所保存的地址处继续执行。
PowerPC Linux (软件)中断处理程序
异常向量ExternalInput处的处理程序主要分为以下几个步骤:
1. NORMAL_EXCEPTION_PROLOG宏
建立用户中断处理程序的栈帧,并把一些寄存器的值保存在栈帧中,它们在栈帧中布局由structpt_regs 定义。
2. 执行 do_IRQ
在irq_enter()函数中更新preempt_count。 读MPIC的IACK寄存器,通知MPIC开始处理该中断,同时获取MPIC中断号,映射为软件中断号,找到并运行注册在该软件中断号上的用户中断处理程序,最后写MPIC的EOI寄存器,通知MPIC中断处理结束。
在irq_exit()中更新preempt_count,调用invoke_softirq()处理pending的软中断。
3. ret_from_except
某些条件满足时,进行进程调度和信号处理,最后调用rfi指令返回。
PowerPC vxWorks(软件)中断处理程序