2026/1/16 19:30:22
网站建设
项目流程
wap网站技术,阿里巴巴的电子商务网站建设,集团网站建设效果,佛山网上业务系统在armv7架构#xff0c;smp系统(多核)下#xff0c;外设中断signal到cpu的过程如下图#xff1a;外设中断信号(hardware interrupts)发送给soc的GIC 中断控制器(generic interrupt controller)。GIC中断控制器对外设中断信号进行优先级裁决#xff0c;选出最高优先级的中断…在armv7架构smp系统(多核)下外设中断signal到cpu的过程如下图外设中断信号(hardware interrupts)发送给soc的GIC 中断控制器(generic interrupt controller)。GIC中断控制器对外设中断信号进行优先级裁决选出最高优先级的中断根据GIC中的配置信息找到中断对应的core id, 然后通过cpu interface向该处理器core发出中断请求(中断core路由)。对于NUMA架构由硬件设计决定中断信号是发向那个CPU socket。选中CPU socket后至于向该CPU哪个core发送中断信号和上面描述一样由GIC来配置。GIC可以配置中断的优先级以及处理该中断的core id。我们接着往下。当core收到中断信号后core会自动作一些事情:core进入了异常模式(IRQ)从异常向量表中(0xffff0000)选择IRQ的处理句柄vector_irq来处理。vector_irq定义如下vector_irq主要关注在1016行将中断前的cpsr(中断发生时被硬件拷贝至spsr)保存到堆栈这个spsr.I肯定是0即允许中断. 然后根据中断之前的Mode选择对应的处理句柄。如果中断之前是用户模式则进入__irq_usr。如果中断之前是svc模式则进入__irq_svc。先看__irq_usr.__irq_usr - irq_handler - handle_arch_irq -gic_handle_irq() - handle_domain_irq()-__handle_domain_irq()-generic_handle_irq()-generic_handle_irq_desc()这里这个desc-handle_irq由irq-gic.c注册。desc-handle_irq就是handle_percpu_devid_irq().这个desc-handle_irq()最终就是调用驱动程序通过request_irq()注册的处理句柄。回到__handle_domain_irq()__handle_domain_irq()在调用generic_handle_irq()后进入irq_exit(), 这里进行sofirq处理也就是中断的下半部。最后回到__irq_usr.Irq_handler处理好后跳转到ret_to_user_from_irq返回中断前的上下文。ret_to_user_from_irq - restore_user_regs可见, __irq_usr是在中断的上半部和下半部处理完成后才打开IRQ的即不允许中断嵌套也不允许高优先级打断还为处理好的低优先级处理程序。再看__irq_svc(中断前是svc模式)。__irq_svc先调用svc_entry将在vector_irq保存的中断前的cpsr信息保存到当前使用的sp堆栈中。__irq_svc之后也是调用irq_handler处理中断这个和__irq_usr调用irq_handler是一样的不重复了。最后__irq_svc调用svc_exit退出中断处理。第一个参数r5为中断之前的cpsr数据。svc_exit将中断前的cpsr保存到栈顶最后通过rfeia指令将栈顶的数据恢复即恢复中断前的cpsr数据也就是enable IRQ.可见在armv7架构下外设中断发生后cpu自动设置cpsr.I, 屏蔽中断请求然后处理中断请求调用中断上半部句柄和中断下半部句柄处理最后返回中断前的上下文cpsr.I恢复到中断前的cpsr.I, 即enable IRQ.