内核模式clock_gettime()



我试图在内核中使用POSIX时钟函数,但编译器一直给我错误:错误:函数' clock_gettime '的隐式声明

long __timer_end(struct timespec start_time)
{
    struct timespec end_time;
    clock_gettime(CLOCK_REALTIME_COARSE, &end_time);
    return(end_time.tv_nsec - start_time.tv_nsec);
}
struct timespec __timer_start(void)
{
    struct timespec start_time;
    clock_gettime(CLOCK_REALTIME_COARSE, &start_time);
    return start_time;
}

函数在<linux/posix_clock.h>中被定义为结构posix_clock_operations的一部分,并且有一对函数posix_clock_register()posix_clock_unregister()。这些注释使人相信这些函数将填充posix_clock_operations结构。我已经在我的init和exit函数中实现了这两个函数,希望它们的存在会神奇地使clock_gettime()的前向声明出现,但事实并非如此。

有人知道我需要做什么来使这个函数工作吗?我真的需要定义所有自己的函数来填充posix clock_operations吗?

提前感谢,

皮特

似乎在内核中没有clock_gettime(),但是有一个称为current_kernel_time()的nsec分辨率时钟。所以重写我的定时器看起来像这样:

long timer_end(struct timespec start_time)
{
    struct timespec end_time = current_kernel_time();
    return(end_time.tv_nsec - start_time.tv_nsec);
}
struct timespec timer_start(void)
{
    return current_kernel_time();
}

它似乎工作得很好,但同样的更高性能版本适合ns粒度性能测试看起来像这样:

long timer_end(struct timespec start_time)
{
    struct timespec end_time;
    getrawmonotonic(&end_time);
    return(end_time.tv_nsec - start_time.tv_nsec);
}
struct timespec timer_start(void)
{
    struct timespec start_time;
    getrawmonotonic(&start_time);
    return start_time;
}

谢谢你的评论和指点。

皮特

正如pjenney58在回答中指出的那样,您可以使用current_kernel_time(),但请记住,它为您提供了"wallclock"时间(以HZ精度表示),如果您想要分析一些内核代码所花费的时间,则不建议使用该时间-仅仅因为它也会考虑在挂起模式下花费的时间。为了在内核代码中分析时间,内核中有一个相当于clock_gettime(CLOCK_MONOTONIC,...)的用户域,即do_posix_clock_monotonic_gettime(),它在timekeeping.h中被定义为宏。它接受指向struct timespec的指针作为参数,单调时钟时间以秒和nsec精度返回。

相关内容

  • 没有找到相关文章

最新更新