【问题标题】:Where is jiffies computed in the Linux kernel?在 Linux 内核中计算 jiffies 的位置在哪里?
【发布时间】:2014-07-23 16:10:55
【问题描述】:

我正在将 3.14 移植到成功运行 3.2 内核的基于 ARM 的 SOC。

我陷入了校准 jiffies 的代码中。

calibrate_delay_converge()-init/calibrate.c

    /* wait for "start of" clock tick */
    ticks = jiffies;
    while (ticks == jiffies)   <---- infinite loop waiting for jiffies to change
            ; /* nothing */
    /* Go .. */

jiffies 没有更新。 jiffies在哪里更新?我正在寻找像 jiffies++ 这样的吸烟枪代码或更新 jiffies 的 .S 文件。

我在 Linux 中遇到了定时器和中断系统的兔子洞。定时器中断未启用(在 PL190 硬件中)。我希望如果我可以从下往上跟踪(应该调用 jiffies),我可以找到为什么没有启用中断。

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    查看 do_timer()。在过去几年的某个时间点,它已移至 kernel/time/timekeeping.c。

    jiffies 不直接递增,它被分配 jiffies_64 的低 32 位

    /* 
     * The 64-bit jiffies value is not atomic - you MUST NOT read it 
     * without sampling the sequence number in xtime_lock. 
     * jiffies is defined in the linker script... 
     */ 
    void do_timer(unsigned long ticks) 
    { 
     jiffies_64 += ticks; 
     update_wall_time(); 
     calc_global_load(ticks); 
    } 
    

    在 3.2 中是http://lxr.free-electrons.com/source/kernel/time/timekeeping.c?v=3.2#L1192

    jiffies 从机器特定文件中的 jiffies_64 获取值:

    http://lxr.free-electrons.com/source/arch/arm/kernel/vmlinux.lds.S?v=3.2

     36 #ifndef __ARMEB__
     37 jiffies = jiffies_64;
     38 #else
     39 jiffies = jiffies_64 + 4;
     40 #endif
    

    【讨论】:

    • 我认为 do_timer() 是确凿的证据。我的定时器中断处理程序调用clock_event_device.event_handler(),由clockevents_register_device() 设置为tick_handle_periodic()。 tick_handle_periodic() 调用 tick_periodic() 调用 do_timer()
    • 第二个代码示例只是一个链接器技巧。它将 jiffies_64 的低 32 位命名为 jiffies。
    • 是的。为读者详细说明,ARMEB 是大端的,因此是有条件的。
    猜你喜欢
    • 2020-08-31
    • 2016-11-29
    • 2012-11-19
    • 1970-01-01
    • 2015-05-05
    • 2020-07-19
    • 2021-01-13
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多