尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Arm GIC-v3中断原理及验证(通过kvm-unit-tests)

Arm GIC-v3中断原理及验证(通过kvm-unit-tests) 零、参考连接gic-v3相关原理可参考https://zhuanlan.zhihu.com/p/520133301本文主要通过开源测试工具kvm-unit-tests,针对GIC的中断进行一系列验证,这样可以直入中断底层,熟悉整个原理。kvm-unit-tests官网为kvm-unit-tests / KVM-Unit-Tests · GitLabarmv8寄存器介绍官网为Documentation – Arm DeveloperGICv3官方文档为Documentation – Arm Developer一、GICv3中断说明GIC的中断主要为四类,即SGI(IPI)、PPI、SPI、LPI,本文主要针对这四类进行验证。具体原理将在验证中随意阐述。总体来看kvm-unit-tests源码的理解难度要低于kernel源码,所以方便引用,其实底层逻辑其实是一样的。 GIC总计结构: GIC中断分布:中断类型中断号说明SGI0 - 15PPI16 – 31SPI32 - 1019特殊中断号1020 - 1023保留中断号1024 - 1055扩展PPI1056 -1119GICv3.1版本后才支持保留中断号1120 - 4095扩展SPI4096 - 5119GICv3.1版本后才支持保留中断号5120 - 8191LPI8192 -最大支持的中断号由实现确定四类中断的控制寄存器说明如下:四类中断的路由规则如下: 先来整体看下一个机器中断的整体分布,我是在VM中: 再来看个kvm-unit-tests的整体测试吧,就当留个印象。二、中断验证2.1 SGI(software generated interrupt)(IPI)中断验证[0-15]该类型中断并没有实际的物理连线,而是通过由软件写寄存器方式触发,它只支持边沿触发。通常用于处理器之间的通信,如linux内核电源管理模块中调用的ipi中断就是通过SGI实现的。IPI即核间中断,arm的叫sgi。kvm-unit-tests(本文以后简称k-u-t)中正好有专门的SGI检测项,可以通过总体测试然后log输出,也可以单独加参数测试验证:2.1.1中断发送发送中断的本质其实,从软件层面来讲,其实就是写寄存器。发送SGI中断的步骤归纳如下:通过GICR_ISENABLER0寄存器设置中断使能通过GICR_IPRIORITYRn设置优先级写寄存器 GICD_SGI1R写寄存器 ICC_SGI1R_EL1kut中关于发送sgi中断的函数是lib/arm/gic-v3.c中的gicv3_ipi_send_mask()函数(可类比kernel-5.10中的gic_ipi_send_mask函数),
返回列表