我正在实现一个内核模块,在其中我需要测量一些事件之间的时间。为此,我使用功能 getnstimeofday 来获取当前时间戳(以纳秒为单位)。然后,我正在计算两个事件之间的时间,例如:
nsecs_elapsed = t2 - t1;
但是,当纳秒计数器回绕(溢出并从零开始再次计数)时,计算不正确,在这种情况下,我得到的t2比t1小。如果是这种情况,我想通过以下方式计算经过的纳秒数:
nsecs_elapsed = (POSSIBLE MAX_VALUE_TV_NSEC - t1) + (++t2);
其中“ POSSIBLE_MAX_VALUE_TV_NSEC”应为函数 getnstimeofday 返回的最大可能值。
现在,此函数(即 getnstimeofday )将此信息填充到 struct timespec 变量的 tv.nsec 成员中(其地址必须为作为参数传递给函数 getnstimeofday )。 由于 tv.nsec 的类型为 long ,因此 long 变量的最大值可能是此函数返回的最大可能值,但是根据我的观察,事实并非如此。
从该函数(即 getnstimeofday )中,我总是以9位数的形式获得纳秒数,因此我认为该函数返回的最大值应该是 999999999 ,但我想对此进行确认。我在任何地方都找不到这样的信息,在查看内核的代码时,我仍然不清楚该函数是否返回了除 signed long 的最大值以外的最大可能值。
有人知道 getnstimeofday 的返回值是否由某个最大值定界吗? 还是您不知道该在哪里找到该信息?
答案 0 :(得分:1)
函数getnstimeofday
填充结构中的两个字段:
这两个字段总共不能溢出:tv_sec
部分溢出需要数百年的时间。
由于每秒有10 ^ 9纳秒,因此tv_nsec
字段的最大值为999999999。