时间子系统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