C 如何获得linux内核服务中断所花费的时间

C 如何获得linux内核服务中断所花费的时间,c,linux,performance,linux-kernel,irq,C,Linux,Performance,Linux Kernel,Irq,我想跟踪一段代码中的抖动,我知道有很多潜在的来源(任务切换、系统调用、缓存未命中、将任务移动到另一个CPU、CPU节流等),我知道如何跟踪所有这些,但我唯一不知道如何跟踪的是内核用于服务中断的时间。数据在/proc/stat中,但它在软irq和低分辨率irq中测量时间,我正在寻找分辨率更高的数据 有没有办法把内核服务中断所花费的时间降低到纳秒或至少微秒 Yes在调用handle\u IRQ前后放置printk屏幕上的计时器通常是高分辨率的: 86 /* 87 * asm_do_IRQ is

我想跟踪一段代码中的抖动,我知道有很多潜在的来源(任务切换、系统调用、缓存未命中、将任务移动到另一个CPU、CPU节流等),我知道如何跟踪所有这些,但我唯一不知道如何跟踪的是内核用于服务中断的时间。数据在/proc/stat中,但它在软irq和低分辨率irq中测量时间,我正在寻找分辨率更高的数据


有没有办法把内核服务中断所花费的时间降低到纳秒或至少微秒

Yes在调用
handle\u IRQ
前后放置printk屏幕上的计时器通常是高分辨率的:

 86 /*
 87  * asm_do_IRQ is the interface to be used from assembly code.
 88  */
 89 asmlinkage void __exception_irq_entry
 90 asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
 91 {
 92         handle_IRQ(irq, regs);
 93 }
 94 
如果您询问有关
irq\u延迟的问题
请查看以下漂亮的答案:


您可以编译一个自定义内核,在中断进入/退出时翻转gpio,然后在逻辑分析仪上跟踪计时。任何测量某物的尝试都会影响某物(在不同程度上)。因此,最好使用外部测量,例如@TJD的注释。但要小心:请记住,
printk()
不是免费的。如果内核消息被打印到控制台,那么您的度量结果可能会被生成该输出所需的时间所支配!同意您可以使用循环计数器,具体取决于您的平台,并通过将增量除以核心频率来计算时间差。