linux 内核:了解 jiffies diff 是如何计算的

linux kernel: understand how jiffies diff is calculated

我在内核中遇到了以下代码:

/*
 * Have the 32 bit jiffies value wrap 5 minutes after boot
 * so jiffies wrap bugs show up earlier.
 */             
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

static inline u32 cstamp_delta(unsigned long cstamp)
{
        return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
}

其中 cstamp 值在 jiffies.

这是来自 net/ipv4/devinet.c 的代码,其中实现了每个接口的 IP 地址(以及其他内容)。

我看到 INITIAL_JIFFIES 宏取值 5 分钟(300)并将其转换为 jiffies-300*HZ),类型转换确保正确的值换行。

但为什么明确设置为负值(-300*HZ)?

我不确定,单位是什么 cstamp_delta() returns?

why is it explicitly set to negative value (-300*HZ)?

这不是负值。该值被强制转换为 unsigned int,因此它是正数,更准确地说是 UINT_MAX - 300*HZ,这意味着最终值将在达到最大无符号 32 位整数值之前 5 分钟。正如评论所述,这是为了检测部分代码错误地将 jiffies 作为 32 位值处理的错误。

I'm not sure, in what units cstamp_delta() returns?

好吧,cstamp - INITIAL_JIFFIES 只是计算内核启动时间的滴答总数。将此值除以 HZ returns 即开机时间 的总数。由于该值首先乘以 100,因此最终结果是从启动时间开始经过的 的总数。

由于u32是作为return类型使用的,所以这个函数得到的值return当然要相对"soon"回绕1年左右和 4 个月的运行时间 (2^32/100/60/60/24/356)。