当我们使用内核定时器时,内核定时器在软件中断中运行,所以内核定时器函数在定时器中断上下文中运行。
void timer_func(unsigned long arg)
{
my_timer.expires = jiffies + HZ;
add_timer(&my_timer);
}那么add_timer()内核中的定时器函数不需要调度吗?因为在中断上下文中调度被禁用。
发布于 2016-05-25 03:28:33
可以,add_timer函数可以在中断上下文中使用。在计时器回调函数中调用它是重复做某些事情的标准方式。
发布于 2016-05-25 10:36:34
我认为OP的意思是“为什么它在中断ctx中工作?”因此,add_timer()本身并不直接调用schedule();它调用mod_timer():
void add_timer(struct timer_list *timer)
{
BUG_ON(timer_pending(timer));
mod_timer(timer, timer->expires);
}
EXPORT_SYMBOL(add_timer);正如上面的代码注释所说的,这个函数清楚地表明:
"...
* The kernel will do a ->function(->data) callback from the
* timer interrupt at the ->expires point in the future. The
* current time is 'jiffies'.
..."因此,它不会直接调用schedule();它将在到期时调用计时器函数。请注意,计时器功能在(软)中断上下文中运行,因此不要执行任何将直接或间接调用schedule()的操作。
https://stackoverflow.com/questions/37419510
复制相似问题