時間子係統3_低分辨率定時框架初始化
// 低分辨率定時器框架初始化 // 調用路徑:start_kernel->init_timers // 函數任務: // 1.創建當前cpu的定時器框架數據結構 // 2.監聽cpu狀態信息 // 3.注冊低分辨率軟中斷 1.1 void __init init_timers(void) { //創建當前cpu的定時器框架數據結構 int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); //監聽cpu狀態信息 register_cpu_notifier(&timers_nb); //注冊低分辨率軟中斷 open_softirq(TIMER_SOFTIRQ, run_timer_softirq); } // cpu狀態監聽控製塊 2.1 static struct notifier_block __cpuinitdata timers_nb = { .notifier_call = timer_cpu_notify, }; // 低分辨率定時器框架處理cpu狀態 // 函數任務: // 1.cpu up,創建本cpu的低分辨率定時器框架 // 2.cpu dead,遷移其定時器到本cpu上 2.2 static int __cpuinit timer_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { long cpu = (long)hcpu; //cpu up,創建本cpu的低分辨率定時器框架的數據結構 switch(action) { case CPU_UP_PREPARE: case CPU_UP_PREPARE_FROZEN: if (init_timers_cpu(cpu) < 0) return NOTIFY_BAD; break; //熱插拔cpu,才會出現cpu dead、frozen信息 #ifdef CONFIG_HOTPLUG_CPU case CPU_DEAD: case CPU_DEAD_FROZEN: //遷移其cpu的定時器到本cpu migrate_timers(cpu); break; #endif default: break; } return NOTIFY_OK; } // 創建cpu的定時器框架數據結構 // 調用路徑:timer_cpu_notify->init_timers_cpu // 函數任務: // 1.分配低分辨率定時器框架數據結構 // 2.初始化tvec_base的鏈表頭 // 3.設置定時器的到期時間戳為當前時間 3.1 static int __cpuinit init_timers_cpu(int cpu) { int j; struct tvec_base *base; //分配低分辨率定時器框架 base = kmalloc_node(sizeof(*base), GFP_KERNEL | __GFP_ZERO, cpu_to_node(cpu)); base = per_cpu(tvec_bases, cpu); spin_lock_init(&base->lock); //初始化tvec_base的鏈表 for (j = 0; j < TVN_SIZE; j++) { INIT_LIST_HEAD(base->tv5.vec + j); INIT_LIST_HEAD(base->tv4.vec + j); INIT_LIST_HEAD(base->tv3.vec + j); INIT_LIST_HEAD(base->tv2.vec + j); } for (j = 0; j < TVR_SIZE; j++) INIT_LIST_HEAD(base->tv1.vec + j); //timer_jiffies記錄一個時間點,標識此前到期的定時器都已經執行 base->timer_jiffies = jiffies; base->next_timer = base->timer_jiffies; return 0; } // 低分辨率定時器框架數據結構 // 注:默認情況下,TVN_SIZE=64,TVR_SIZE=256 3.2 struct tvec { struct list_head vec[TVN_SIZE]; }; struct tvec_root { struct list_head vec[TVR_SIZE]; }; struct tvec_base { spinlock_t lock; struct timer_list *running_timer; //當前正在運行的timer_list unsigned long timer_jiffies; unsigned long next_timer; struct tvec_root tv1; struct tvec tv2; struct tvec tv3; struct tvec tv4; struct tvec tv5; } ;
// 參考 深入理解linux內核架構
最後更新:2017-04-03 14:54:25