Linux内核中计算的jiffies在哪里?

时间:2014-07-23 16:10:55

标签: linux-kernel

我将3.14移植到基于ARM的SOC,该SOC已成功运行3.2内核。

我陷入了校准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 ++或.S文件更新jiffies的冒烟枪代码。

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

1 个答案:

答案 0 :(得分:4)

看看do_timer()。在过去的几年里,它被移到了kernel / time / timekeeping.c。

jiffies没有直接递增,它被赋予低位32位的jiffies_64

/* 
 * 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