ARMv7 linux中断路由以及处理

在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处理,也就是中断的下半部。

invoke_softirq() -> __do_softirq(), __do_softirq在处理软中断前,打开了IRQ。

最后,回到__irq_usr.

Irq_handler处理好后,跳转到ret_to_user_from_irq返回中断前的上下文。

ret_to_user_from_irq -> restore_user_regs

可见, __irq_usr是在中断的上半部是禁IRQ的,即不允许中断嵌套,也不允许高优先级打断还为处理好的低优先级处理程序。而在中断下半部,即软中断处理时,打开了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, 屏蔽中断请求,然后处理中断请求,先调用中断上半部句柄,然后检查是否由软中断需要处理(中断下半部), 有软中断要处理,则打开core的IRQ,即设置cpsr.I为0,然后处理软中断。最后,返回中断前的上下文,cpsr.I恢复到中断前的cpsr.I, 即enable IRQ.

相关推荐
三小尛5 小时前
linux的开发工具vim
linux·运维·vim
陈陈爱java5 小时前
Conda 常用命令行
linux·windows·conda
twdnote5 小时前
dokcer 环境中集成LibreOffice
linux
ChristXlx5 小时前
Linux安装redis(虚拟机适用)
linux·运维·redis
源文雨5 小时前
PVE实现USB硬盘盒在备份前自动上电/结束后自动断电脚本
linux·运维·服务器·备份·perl·pve·usb硬盘盒
ascarl20105 小时前
准确--CentOS 7 配置用户资源限制(nofile / nproc)
linux·运维·centos
秋深枫叶红5 小时前
嵌入式第三十六篇——linux系统编程——线程
linux·运维·服务器·学习
老王熬夜敲代码6 小时前
Linux信号量
linux·笔记·面试
顾安r6 小时前
12.17 脚本工具 自动化全局跳转
linux·前端·css·golang·html