In Linux, quali sono le opzioni per gestire gli interrupt di dispositivo nello spazio utente codice piuttosto che nello spazio del kernel?Gestione interrupt Linux nello spazio utente
risposta
C'è , ma la gestione di deve ancora essere eseguita in kernelspace. OTOH, se hai solo bisogno di notare l'interrupt, non hai bisogno della parte del kernel.
Si potrebbe dare un'occhiata a CHAPTER 10: Interrupt Handling dal Linux Device Drivers, Third Edition libro.
L'esperienza dice che è possibile scrivere driver di spazio utente validi e stabili per quasi tutti gli adattatori PCI. Richiede solo un po 'di sofisticazione e un piccolo strato di proxy nel kernel. UIO è un passo in questa direzione, ma se si desidera gestire correttamente gli interrupt nello spazio utente, UIO potrebbe non essere sufficiente, ad esempio se il dispositivo non supporta il bit di interrupt di interrupt della specifica PCI su cui si basa l'UIO.
Si noti che le latenze di riattivazione del processo sono di pochi microsec, quindi se l'implementazione richiede una latenza molto bassa, lo spazio utente potrebbe essere un trascinamento.
Se fossi a implementare un driver user-spazio, ridurrebbe l'ISR kernel per solo un "disabilitare & ack & wakeup-userpace" operazione, gestire l'interrupt all'interno del processo risvegliato-up, e quindi riattivare l'interruzione (ovviamente, scrivendo sulla memoria PCI mappata dal processo userspace).
È necessario attivare indirettamente il codice utente.
Kernel ISR indica l'interruzione scrivendo file/impostazione registro/segnalazione. L'applicazione dello spazio utente esegue il polling di questo e continua con il codice appropriato. Casi di margine: più o meno interruzioni del previsto (timeout/troppe interruzioni per intervallo di tempo)
L'astrazione di file Linux viene utilizzata per connettere il kernel e lo spazio utente. Ciò viene eseguito dai dispositivi di carattere e dalle chiamate ioctl()
. Alcuni potrebbero preferire voci sysfs per questo scopo.
Questo può sembrare strano perché le notifiche dei dispositivi attivati dall'evento (interrupt) sono agganciate al polling "time triggered", ma in realtà è un blocco asincrono (lettura/selezione). Ad ogni modo alcune domande sorgono in base alle prestazioni.
Quindi gli interrupt non possono essere gestiti direttamente all'esterno del kernel. E.g. la memoria condivisa può essere nello spazio utente e con alcune impostazioni di autorizzazione I/O è possibile mappare gli indirizzi, quindi U-I/O funziona, ma non per la gestione diretta degli interrupt.
ho trovato solo un 'Minority Report' in argomento vfio (http://lxr.free-electrons.com/source/Documentation/vfio.txt): https://stackoverflow.com/a/21197797/5349798
domande simili:
Running user thread in context of an interrupt in linux
Is it possible in linux to register a interrupt handler from any user-space program?
Linux Kernel: invoke call back function in user space from kernel space
How do I inform a user space application that the driver has received an interrupt in linux?
Quando facciamo conducente userspace, Ha senso per cancellare interrompere in kernel o nello spazio utente? Penso che dovrebbe essere chiaro quando la gestione è fatta (quindi nello userspace), giusto? – ransh