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

相关推荐
AZ996ZA8 分钟前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
_OP_CHEN14 分钟前
【Linux系统编程】(二十八)深入 ELF 文件原理:从目标文件到程序加载的完整揭秘
linux·操作系统·编译·c/c++·目标文件·elf文件
Fleshy数模1 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
神梦流1 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
.小墨迹2 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
Lsir10110_2 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
Sheffield2 小时前
command和shell模块到底区别在哪?
linux·云计算·ansible
历程里程碑3 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴3 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
承渊政道3 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee