内容提要
PMU(性能监控单元)是硬件计数器,可统计周期、指令、分支预测错误等事件,溢出时触发PMU中断通知软件数据已重置。在Armv8 Linux内核中,可通过request_irq注册自定义处理函数,需先修改内置arm-pmu驱动添加IRQF_SHARED标志以共享中断;固件层可在EL3或Secure-EL1处理。最简便的使用方式是perf工具。
延伸解读
PMU中断的触发机制与软件控制
PMU中断仅在计数器溢出时触发,通知软件计数器已重置。但通过将计数器寄存器设置为接近最大值,可以在每次事件发生时快速触发中断。这种可编程性允许开发者在性能开销和测量精度之间灵活权衡,例如动态调整计数值以适应不同监控需求。
在Linux内核中自定义PMU中断处理
Linux内置的arm-pmu驱动已处理PMU中断,但用户可通过修改驱动添加IRQF_SHARED标志,使中断可共享,然后使用request_irq注册自定义处理函数。需注意逻辑中断ID和硬件中断ID的映射关系,这有助于正确注册和处理中断。
固件层处理PMU中断的适用场景
在固件层(如EL3或Secure-EL1)处理PMU中断,适用于不希望操作系统介入的跟踪工具。需要配置GIC将中断路由到最高安全等级,并在ATF或TEE-OS中注册处理程序。这种方法提供了更高的安全性和隔离性,但实现复杂度较高。
使用perf工具简化PMU数据采集
对于大多数用户,直接使用perf工具是访问PMU功能的最简便方式。perf利用Linux内置的PMU中断处理程序,无需自行编写内核模块或修改驱动,即可监控多种硬件事件,如周期数、指令数和分支预测错误,从而快速获得性能洞察。
Q&A
PMU是什么?它主要用来做什么?
PMU是性能监控单元(Performance Monitor Unit),是一组硬件计数器,可以统计核心中各种事件,例如周期数、执行的指令数、分支预测错误等。它用于帮助软件了解程序在硬件上的执行情况,从而优化性能。
PMU中断什么时候触发?它的作用是什么?
PMU中断在PMU计数器溢出时触发。它的作用是通知软件计数器即将重置为零,因此软件不应依赖最终值减去起始值的结果。通过这种方式,软件可以及时获知硬件事件的发生,而无需轮询计数器。
在Armv8 Linux内核中,如何注册自定义的PMU中断处理函数?
首先需要修改Linux内置的arm-pmu驱动,为其添加IRQF_SHARED标志,使中断可共享。然后编写内核模块,使用request_irq()函数注册自定义处理函数,传入逻辑中断ID、处理函数指针、标志(如IRQF_PERCPU | IRQF_NOBALANCING | IRQF_NO_THREAD | IRQF_SHARED)等参数。
为什么需要修改Linux内置的arm-pmu驱动才能注册自己的PMU中断处理函数?
因为通常一个中断只能有一个处理函数,而Linux已经为PMU注册了内置处理函数。为了同时使用内置处理函数和自定义处理函数,需要将内置处理函数的中断标志修改为IRQF_SHARED,使中断可共享,从而允许其他处理函数挂钩。
如何在固件层(如EL3或Secure-EL1)处理PMU中断?
首先配置GIC(全局中断控制器)将中断路由到最高安全等级EL3,然后在ATF(Arm Trusted Firmware)中注册自己的处理函数。也可以将中断重新路由到Secure-EL1,在那里使用自己的TEE-OS进行处理。
使用PMU最简单的方式是什么?
使用perf工具。perf是一个强大的性能分析工具,它利用PMU来监控各种硬件事件,而无需自己编写中断处理程序。Linux内置的PMU中断处理程序就是为perf服务的。