现代x86 CPU是否存在仅统计中断处理执行周期的硬件计数器?
本问题并非重复问题。 有观点认为本问题与讨论Linux下perf指令周期用户态/内核态统计的相关问题重复,但本问题无论标签还是正文均未提及“Linux”或“Kernel”相关内容,因此将本问题判定为Linux与perf相关问题的重复项是错误的。
我希望了解如何不借助外部程序测量中断耗时。 即直接在代码中自主完成时间测量,理想实现方式为读取硬件寄存器取值,本问题的讨论前提为无操作系统(bare-metal)运行环境。
我在类Pentium-M处理器上运行的汇编程序中,需要测量某一过程的执行耗时。常规场景下该需求实现难度极低,现有大量公开资料介绍实现方法,我本人也有可稳定运行的成熟测量方案。
当前场景的特殊难点在于:待测过程可能随时被硬件中断打断。我需要测量的是过程本身的纯执行时间,因此测量逻辑可拆分为三个步骤:
- 测量待测过程从启动到结束的总墙钟耗时(实现简单)
- 测量待测过程运行期间,所有中断处理程序的总执行耗时(实现难度较高)
- 将中断处理总耗时从总墙钟耗时中扣除,即可得到待测过程的纯执行时间
我此前一直认为现代Intel PC级CPU提供了仅在CPU执行中断处理程序时递增的硬件计数器,但实际核查后未发现这类计数器——至少我在《Intel 64和IA-32架构软件开发者手册》的“性能监控”章节中没有找到相关描述。
我目前已经实现了一套可满足当前需求的临时测量方案,但该方案精度无法满足未来场景的使用要求,且实现方式不够优雅。
因此我希望确认:是否存在我此前遗漏的硬件计数器,可实现仅在执行中断处理程序时计数(或反之,仅在执行非中断处理程序代码时计数)的功能。
禁用中断后直接测量过程纯执行时间的方案不可行,因为中断处理程序中执行的操作会对待测过程的实际执行行为产生影响,禁用中断会改变待测过程的真实运行状态,导致测量结果失真。
固定运行约束:
- 待测过程与中断处理程序运行在同一CPU核心上
- 所有代码(包括待测过程与中断处理程序)均运行在ring0权限级
内容的提问来源于stack exchange,提问作者Binarus

