我将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),我可以找到为什么中断没有被启用。
答案 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