C linux下如何获得高精度纳秒延时

C linux下如何获得高精度纳秒延时,c,linux,linux-kernel,delay,C,Linux,Linux Kernel,Delay,我编写了内核模块来衡量ndelay()内核函数的正确性 #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/time.h> #include <linux/delay.h> static int __init initialize(void) { ktime_t start, end; s6

我编写了内核模块来衡量ndelay()内核函数的正确性

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/delay.h>
static int __init initialize(void)
{
    ktime_t start, end;
    s64 actual_time;
    int i;
    for(i=0;i<10;i++)
    {
        start = ktime_get();
            ndelay(100);            
        end = ktime_get();
        actual_time = ktime_to_ns(ktime_sub(end, start));
        printk("%lld\n",(long long)actual_time);    
    }
    return 0;
}

static void __exit final(void)
{
     printk(KERN_INFO "Unload module\n");
}

module_init(initialize);
module_exit(final);

MODULE_AUTHOR("Bhaskar");
MODULE_DESCRIPTION("delay of 100ns");
MODULE_LICENSE("GPL");
我浏览了stackoverflow中的一个帖子:

但我希望在内核空间中有一个微调的纳秒延迟(可能在100-250ns的范围内)。有谁能建议我做这件事的其他方法吗?

你可以使用

High resolution timers (or hrtimers)

    hrtimer_init
    hrtimer_start
    hrtimer_cancel

功能。一个例子是可用的

如果您针对的是仅x86系统,则可以使用rdtsc()调用来获取CPU时钟计数。rdtsc()api的开销非常小。但您确实需要将CPU时钟转换为ns,这取决于CPU时钟的运行速度

static unsigned long long rdtsc(void)
{
    unsigned int low, high;
    asm volatile("rdtsc" : "=a" (low), "=d" (high));
    return low | ((unsigned long long)high) << 32;
}
静态无符号长rdtsc(无效)
{
无符号整数低,高;
asm挥发性(“rdtsc”:“=a”(低)、“=d”(高);

返回low |((unsigned long long)high)这在内核空间中不起作用。我需要一个内核空间函数。感谢这些数字包括调用
ktime_get()所需的时间
;实际延迟更小。上面的代码片段返回周期数或时间间隔本身?rdtsc仅返回时钟周期。它速度快,开销低,但您确实需要根据您的CPU速度进行转换,并且它仅为x86。谢谢您的评论。但我在这里很困惑。我的CPU有12个内核。您能提供一个示例吗将从rdtsc获得的循环数转换为以纳秒为单位的实际时间?
static unsigned long long rdtsc(void)
{
    unsigned int low, high;
    asm volatile("rdtsc" : "=a" (low), "=d" (high));
    return low | ((unsigned long long)high) << 32;
}