linux jiffies 初始化不为0问题分析

1,在 32 位系统中,jiffies 是一个 32 位的无符号整数。

复制代码
    /*
     * Have the 32 bit jiffies value wrap 5 minutes after boot
     * so that the jiffies_wrap test works correctly.
     */
    extern u64 jiffies_64;
    extern unsigned long volatile jiffies;

    #if BITS_PER_LONG < 64
    // 对于 32 位系统,初始值设置为 (unsigned long)(-300*HZ)
    // 即距离 0 溢出仅剩 300 秒(5分钟)
    # define INITIAL_JIFFIES ((unsigned long)(unsigned int)(-300*HZ))

    #else
    // 对于 64 位系统,初始值就是 0
    # define INITIAL_JIFFIES 0
    #endif

注:HZ 是内核每秒的时钟中断频率(通常是 200 ),查看内核宏配置

CIONFIG_HZ=200

实际的 jiffies 变量定义在内核的主时间文件中。

  • 文件路径: kernel/time/timer.c

    复制代码
      /*
       * The current time:
       * wall_to_monotonic is what we need to add to xtime (or xtime corrected
       * for sub jiffie times) to get to monotonic time.  Monotonic is pegged
       * at zero at system boot.
       */
      
      // 这里使用上面的宏 INITIAL_JIFFIES 进行初始化
      unsigned long volatile __cacheline_aligned jiffies = INITIAL_JIFFIES;

为什么不为 0: 为了在 32 位系统启动后的 5 分钟内 强制触发一次时间回绕,从而尽早测试和暴露内核代码中关于时间比较的 Bug。

  • 32 位最大值: 4294967295 (0xFFFFFFFF0xFFFFFFFF)

  • 初始值计算:

    Initial=Max_Value−Offset+1Initial=Max_Value−Offset+1

所以,初始值=4294967296−60000=4294907296

  1. 打开文件:init/main.c

  2. 找到函数 start_kernel,在函数末尾(在 rest_init(); 之前)加入以下代码:

    复制代码
     /* --- Debug Code Start --- */
     printk(KERN_EMERG "=== System Boot Debug Info ===\n");
     printk(KERN_EMERG "HZ is %d\n", HZ);
     printk(KERN_EMERG "Current jiffies is %lu\n", jiffies);
     /* --- Debug Code End --- */

预期打印结果

当你启动内核,连接串口后,你会看到类似以下的输出(数字是计算好的):

复制代码
[    0.000000] === System Boot Debug Info ===
[    0.000000] HZ is 200
[    0.000000] Current jiffies is 4294907296

5 分钟后打印是啥?

  • 计算过程:

    Current=Initial+60,000Current=Initial+60,000

    Current=4,294,907,296+60,000Current=4,294,907,296+60,000

    Current=4,294,967,296Current=4,294,967,296

  • 溢出判定:

    • 32 位无符号整数的最大值是 4,294,967,295 (0xFFFFFFFF0xFFFFFFFF)。
    • 当数值达到 4,294,967,296 时,刚好超过了最大值 1。
    • 根据模运算,它会回绕到 0

打印结果为:

Current jiffies is 0

相关推荐
不会就选b36 分钟前
数据结构之栈的算法题(OJ)
linux·数据结构·算法
刘某的Cloud1 小时前
k8s部署prometheus架构规则
linux·运维·kubernetes·prometheus·监控
mounter6251 小时前
从 2026 LSFMM/BPF 峰会看 eBPF 生态演进:技术变革、工具全景与资源泄漏诊断实战
linux·linux kernel·kernel
M78佐菲1 小时前
Linux学习笔记:网络通信
linux·笔记·学习·算法
AAA代码批发商1 小时前
Days37 Linux C 网络编程:UDP、TCP 与 HTTP 协议实战详解
linux·c语言·网络
好评1241 小时前
【Linux】传输层协议UDP
linux·运维·udp
GreatVicent2 小时前
AI Agent互操作标准化加速:A2A协议正式加入Linux基金会
linux·运维·人工智能·agent·aws·a2a
奇树谦2 小时前
Seaweed中filer.sync原理
linux·服务器·网络
Huangjin007_2 小时前
【Linux 系统篇(十六)】进程(四) : 僵尸进程、孤儿进程、进程优先级
linux·运维·服务器
瞬间&永恒~3 小时前
【Kubernetes】(十五)维护与升级、ETCD 备份和恢复
linux·运维·docker·云原生·kubernetes