内核定时器可用来在未来的某个时间点(基于时钟滴答)调度执行的某个函数。
当定时器运行时,调度定时器的进程可能正在休眠或在其他处理器上执行,或干脆已经退出。
定时器运行在软中断的上下文中,也是一种原子上下文。
进程上下文之外(原子上下文)必须遵守的规则:
不允许访问用户空间。因为没有进程上下文,无法将任何特定进程与用户空间关联起来。
current指针在原子模式下没有任何意义,也是不可用的。因为相关代码和被中断的进程没有任何关联。
不能执行休眠或调度。原子代码不可以调用schedule或者wait_event,也不能调用任何可能引起休眠的函数。
内核代码可以调用in_interrpt()来判断自己是否处于中断上下文。
定时器API:
#include <linux/timer.h>
struct timer_list{
/* ...*/
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
};
void init_timer(struct timer_list *timer);
struct timer_list TIMER_INITIALIZE(_function, _expires, _data);
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list *timer);