8.3.1 init_timer
在前面的示例代码中,demo_dev_open函数在对定时器对象demo_timer的expires、data和function成员赋值前,调用了init_timer函数(内核源码中以宏定义的形式出现)。init_timer函数内部会调用__init_timer,其定义如下(去除了struct timer_list中一些调试相关成员的代码):
- <kernel/timer.c>
- static void __init_timer(struct timer_list *timer,
- const char *name,
- struct lock_class_key *key)
- {
- timer->entry.next = NULL;
- timer->base = __raw_get_cpu_var(tvec_bases);
- timer->slack = -1;
- }
可见init_timer函数主要初始化定时器对象中与内核实现相关的成员,所以设备驱动程序在开始使用定时器对象前,应该调用init_timer,这样从内核层面出发,后续对定时器的一些操作才会被内核所支持,下面在讨论add_timer函数时会看到这一点。