linux内核为什么定时器功能并没有在系统启动后立即启动



我使用内核计时器来安排函数定期运行(一旦计时器初始化并调用函数,计时器就会在该函数内重新安排)。它是作为我的设备驱动程序内核模块的一部分发生的,想要的行为是在系统引导(加载模块)后触发并直接运行该功能。问题是,计时器触发的功能不是在系统引导后立即启动的,而是在引导后大约5分钟后启动的(尽管我可以确认模块已经加载,并且代码执行很早就通过add_timer)。

这是我对计时器的初始化:

// Allocate memory for the timer
struct timer_list* pTimer = (struct timer_list*)vmalloc(sizeof(struct timer_list));
// step 1: Initialising function for the timer
init_timer(pTimer);
// step 2: set timer fields as needed
pTimer->data = (unsigned long)Data;
pTimer->function = ((void(*)(unsigned long))start_routine);
pTimer->expires = -1; // fire immediately
// step 3: register timer
add_timer(pTimer);

,其中start_routine是要运行的函数。然后,在该功能中,我重新安排计时器:

/* reschedule the timer */
pTimer->expires = jiffies + 1; // fire every 4msec
add_timer(pTimer);

整个过程很好,但在系统启动后的最初大约5分钟内没有。

就像我写的那样,我可以看到代码在系统启动后直接通过计时器初始化部分执行(并调用add_timer),但由于某种原因,函数start_routine在启动后的最初5分钟内被阻止。之后,start_routine开始按预期进行调用。在系统启动后,调用计时器功能延迟约5分钟的原因是什么?

pTimer->expires = -1; // fire immediately

没有任何jiffies值具有特殊意义。此代码告诉内核在jiffies计数器达到值-1时运行计时器。在您的机器上,计数器恰好从-75000开始,因此在引导后5分钟达到值-1

pTimer->expires = jiffies + 1; // fire every 4msec

除非CONFIG_HZ设置为250,否则此注释是错误的。

最新更新