Ogni dispositivo Linux sembra essere attuate in modo leggermente diverso, e il modo preferito sembra variare ogni tot Linux rilascia quando si aggiungono/caratteristiche più sicuri più veloci del kernel, ma in generale:
conducente
- Il dispositivo crea leggere e scrivere code di attesa per un dispositivo.
- Qualsiasi thread di processo che desidera attendere per I/O viene inserito nella coda di attesa appropriata. Quando si verifica un'interruzione, , il gestore riattiva uno o più thread in attesa di . (Ovviamente i thread non vengono eseguiti immediatamente come nel contesto dell'interrupt , ma vengono aggiunti alla coda di pianificazione del kernel ).
- Quando è pianificato dal kernel, il thread verifica se le condizioni sono corrette per continuare, se non lo è torna nella coda di attesa.
Un tipico esempio (leggermente semplificata):
Nel driver a inizializzazione:
init_waitqueue_head(&readers_wait_q);
In funzione di lettura di un conducente:
if (filp->f_flags & O_NONBLOCK)
{
return -EAGAIN;
}
if (wait_event_interruptible(&readers_wait_q, read_avail != 0))
{
/* signal interrupted the wait, return */
return -ERESTARTSYS;
}
to_copy = min(user_max_read, read_avail);
copy_to_user(user_buf, read_ptr, to_copy);
Quindi il gestore di interrupt solo numeri:
wake_up_interruptible(&readers_wait_q);
Si noti che wait_event_interruptible() è una macro che nasconde un ciclo che verifica una condizione - read_avail != 0
in questo caso - e si aggiunge ripetutamente alla coda di attesa se risvegliata quando la condizione non è vera.
Come già detto, vi sono diverse varianti: la principale è che se c'è potenzialmente molto lavoro da fare per il gestore di interrupt, si limita a fare il minimo indispensabile e rimanda il resto a una coda di lavoro o a un tasklet (generalmente noto come "metà inferiore") ed è questo che sveglia i fili in attesa.
See Linux Device Driver libro per maggiori dettagli - pdf disponibile qui: http://lwn.net/Kernel/LDD3
È praticamente ha colpito il chiodo sulla testa (tranne che per l'ultima osservazione, non ci sono sondaggi, per la maggior parte). Il multiplexing tra più server e file viene eseguito dal kernel, che è un processo invisibile che coordina cose come questa per conto di tutti gli altri processi. –