‘壹’ linux ARM GIC中断子系统和cpu timer
Linux在ARM GIC中断子系统和CPU timer中实现了中断的高效管理,包括不同类型的中断(SPI、PPI、SGI、LPI)和中断处理流程。本文将详细探讨GIC V3的中断配置、使能,以及Linux驱动中的相关代码示例,同时涉及LPI中断的内存配置和路由机制,以及CPU timer的时钟中断关联。
Linux下的ARM GIC(Generic Interrupt Controller)中断子系统是个关键组件,它负责中断的分发和路由。GIC V3有四种主要的中断类型:SPI(共享外设中断)处理多个CPU的公共设备,PPI(私有外设中断)专供单个CPU,SGI(软件生成中断)用于核间通信,而LPI(局部性特定中断)是GICv3新增,采用消息机制并支持PCIe MSI/MSI-x。
中断流程分为一般和LPI两种,前者涉及多个步骤,后者通过消息传递到相应处理器。Linux驱动中,设备会通过固定HWirq申请中断,驱动会将其转换为系统中断并设置处理函数。
GICV3配置与使能涉及多个寄存器,如GICD_CTLR、GICD_IROUTER等,它们用于控制中断的全局优先级、路由方式和分组。特别是LPI中断,需要在内存中初始化配置和pending表,然后写入相关寄存器以启用。
CPU timer则通过时钟相关寄存器如CNTPS_CVAL_EL1来触发中断,当系统时间戳超过预设值时,中断会被处理。整体而言,Linux与ARM GIC的协作确保了系统的稳定和高效。