在Linux内核空间中以亚微秒精度测量时间

11

我目前在内核中使用do_gettimeofday()函数来测量时间,它给出微秒级的精度。是否有更高精度的替代方法可用(例如纳秒级)?


1
你到底想要“精确”地测量什么?而且你的硬件并不像你想象的那样确定(缓存未命中可能会大大改变时间)。 - Basile Starynkevitch
我想要测量某个硬件执行特定操作所需的时间。我是在其驱动程序中进行测量。 - John Roberts
2个回答

15
< p > ktime_get() 函数返回带有纳秒分辨率的 ktime_t 。 < /p >

1
以下代码使用这些函数似乎会产生0: long long int nsTime = ktime_to_ns(ktime_get()); printk("开始时间(以纳秒为单位)为%d", nsTime); 有任何想法为什么会这样? - John Roberts
3
你需要使用 %lld 来输出 long long int - caf
1
@caf:我有一个类似的问题,即我得到了0纳秒。代码看起来像这样... start = ktime_get(); ... function(); ... end = ktime_get(); actual_time = ktime_to_ns(ktime_sub(end,start)); printk(KERN_INFO "所需时间= %lld\n", (long long)actual_time); - Sagar Jain
@caf 有没有办法将 ktime_get() 映射到用户空间中的相同单位?如果有,请在这里回答 - http://stackoverflow.com/questions/27224325/ktime-get-equivalent-from-user-space - Sandeep

5
据我所知,最精确的计时器应该是处理器特定的计数器寄存器(例如x86中的TSC)。Linux内核提供了从“./arch/x86/include/asm/msr.h”文件中获取rdtsc、rdtscl和rdtscll宏来读取此寄存器值。对于ARM,可以使用cycle counter register
这些寄存器因CPU而异。访问它们的通用接口是“get_cycles”函数,该函数在<linux/timex.h>文件中声明。
也许,this document会有所帮助。

1
在多核机器上,TSC不是太不可靠了吗? - John Roberts
你是对的。在多核机器上,应该小心地使用来自特定CPU的TSC寄存器。 - Wonil
1
这个文档 = 错误链接 - Jay M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接