2014-07-23 78 views
2

我將3.14移植到成功運行3.2內核的基於ARM的SOC。jiffies在Linux內核中計算的位置?

我陷入校準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 HW中)。我希望能夠從底層追蹤(jiffies應該在哪裏被調用),我可以找到爲什麼中斷沒有被啓用。

回答

4

看看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 
+0

我認爲do_timer()是吸菸槍。我的計時器中斷處理程序調用clock_event_device.event_handler(),它通過clockevents_register_device()設置爲tick_handle_periodic()。 tick_handle_periodic()調用tick_periodic()調用do_timer() –

+1

第二個代碼示例僅僅是一個鏈接器技巧。它將jiffies_64的低32位命名爲jiffies。 –

+1

是的。爲了詳細闡述讀者,ARMEB是大端的,因此是有條件的。 – codenheim