0

Wenn wir Kernel-Timer verwenden, werden Kernel-Timer im Software-Interrupt ausgeführt, sodass die Kernel-Timer-Funktion im Timer-Interrupt-Kontext ausgeführt wird.add_timer innerhalb der Kernel-Timer-Funktion erfordert keine Zeitplanung?

void timer_func(unsigned long arg) 
{ 
    my_timer.expires = jiffies + HZ; 
    add_timer(&my_timer); 
} 

So add_timer() innerhalb Kernel-Timer-Funktion nicht Scheduling benötigen? Da im Interrupt Kontext Scheduling deaktiviert ist.

Antwort

1

Ja, add_timer Funktion kann im Unterbrechungskontext verwendet werden. Der Aufruf dieser Funktion innerhalb der Timer-Callback-Funktion ist eine Standardmethode, um wiederholt etwas zu tun.

0

Ich denke, das OP bedeutet "wie kommt es in Interrupt ctx?". Also, add_timer() selbst ruft schedule() nicht direkt auf; es ruft mod_timer():

void add_timer(struct timer_list *timer) 
{ 
    BUG_ON(timer_pending(timer)); 
    mod_timer(timer, timer->expires); 
} 
EXPORT_SYMBOL(add_timer); 

und wie der Code Kommentar über diese Funktionen deutlich sagt:

"... 
* The kernel will do a ->function(->data) callback from the 
* timer interrupt at the ->expires point in the future. The 
* current time is 'jiffies'. 
..." 

So ist es nicht direkt Zeitplan aufrufen(); Es wird Ihre Timer-Funktion nach Ablauf aufrufen. Beachten Sie, dass die Timer-Funktionalität im (Soft-) Interrupt-Kontext ausgeführt wird, also tun Sie nichts, was schedule() direkt oder indirekt aufruft.

Verwandte Themen