Linux kernel 如何将周期转换为纳秒

Linux kernel 如何将周期转换为纳秒,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我想在Linux中将基于CPU计数器寄存器值的周期转换为纳秒 我可以看到Linux提供了cyc_to_ns()/clocksource_cyc2ns api 这两个api都需要传递三个参数 例如: 循环至循环(u64循环、u32多循环、u32移位) 现在我有了cyc(CPU计数器寄存器)值,但没有mult和shift的值 有人能告诉我,我应该如何计算这两个值(mult和shift)?提供了计算mult和shift值的助手: clocks_calc_mult_shift(u32 *mult, u3

我想在Linux中将基于CPU计数器寄存器值的周期转换为纳秒

我可以看到Linux提供了cyc_to_ns()/clocksource_cyc2ns api

这两个api都需要传递三个参数

例如:

循环至循环(u64循环、u32多循环、u32移位)

现在我有了cyc(CPU计数器寄存器)值,但没有mult和shift的值

有人能告诉我,我应该如何计算这两个值(mult和shift)?

提供了计算
mult
shift
值的助手:

clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec)
@to和@from是以HZ为单位的频率值。对于时钟源@to is NSEC_PER_SEC==1GHz,@from是计数器频率。时钟 事件@to是计数器频率,@from是每秒纳秒

@maxsec conversion range参数控制中的时间范围 秒,运行时转换必须包含这些秒 计算出的多重和移位系数。这保证了没有64位 当转换的输入值为 乘以计算出的多重因子。更大的范围可能 通过选择较小的mult和shift降低转换精度 因素


cyc\u to\u ns
用于linux内核实现。如何使用它?我需要用三个必需参数从我的函数中调用这个api。我现在可以有前两个参数,但我如何计算第三个参数,即“shift”?函数将在哪里实现?在文件
kernel/time/sched_clock.c
cyc_to_ns
不能在这个文件之外使用。好的,我可以看到它被定义为静态的,所以不能从sched_clock.c之外的任何其他文件调用,但是相同的计算((cyc*mult)>>shift)可以在这个文件之外完成,在这种情况下,我如何计算“shift”变量?它只是一个优化的变量。计数/频率=时间