時間子係統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