LKMPG: Pianificare compiti

The Linux Kernel Module Programming Guide

Sommario

  1. Prefazione
  2. Introduzione
  3. Ciao Mondo
  4. Fasi preliminari
  5. Comportamento dei driver dei device
  6. Il filesystem /proc
  7. Usare /proc per l'input
  8. Comunicare con i file dei device
  9. Chiamate di sistema
  10. Bloccare i processi
  11. Rimpiazzare printk
  12. Pianificare compiti
  13. I gestori degli interrupt
  14. Multi-processing simmetrico
  15. Insidie comuni
  16. Appendice A
  17. Appendice B


Pianificare i compiti



Molto spesso, abbiamo dei compiti proprietari che devo essere eseguiti in tempi precisi, o molto spesso. se il compito è eseguito da un processo, possiamo metterlo nel file crontab. Se il processo è eseguito da un modulo del kernel, abbiamo due possibilità. La prima è di mettere un processo nel file crontab, che attiverà il modulo tramite una system call quando necessario, per esempio aprendo un file. In ogni caso questo metodo è molto inefficente -- si esegue un nuovo precesso di crontab, si legge un nuovo eseguibile nella memoria, e tutto solo per attivare il modulo del kernel che è comunque caricato nella memoria.

Invece di fare così, si può creare una funzione che sarà chiamato una volta per ogni interrupt. La strada da seguire è creare un compito, tenuto in una struttura workqueue_struct, che terrà un puntatore sulla funzione. Successivamente, si userà queue_delayed_work per mettere il compito in una lista di compiti chiamata my_workqueue, che è la lita dei compiti che saranno eseguiti nel prossimo interrupt. Siccome vogliamo che la funzione sia portata in esecuzione**, abbiamo bisogno di metterela ancora nella lista my_workqueue ogni volta che è chiamata, per il prossimo interrupt.

C'è ancora un putnto che dobbiamo ricordare. Quando un modulo è rimosso tramite rmmod, prima di tutto è controllato il conteggio delle sue referenze Se è zero, è eseguito module_cleanup.Poi, il modulo è rimosso dalla memoria con tutte le sue funzioni. E' importante avere tutte cose di cui si ha bisogno per essere arrestato correttamente,o potrebbero accadere imprevisti spiacevoli. Si guardi il codice sotto dove si nota come può essere fatto in un modo sicuro.