Now I have read that device drivers in Linux needs to run in kernel mode. But why is that? ... why can't the device driver also runs in user mode?
I driver vengono eseguiti in modalità kernel mentre le applicazioni vengono eseguite in modalità utente per molte ragioni. Ad esempio
- un driver ha bisogno di alta priorità per servire l'I / O del dispositivo in modo prevedibile (e altrimenti può rischiare di perdere alcuni dati). Ad esempio, i driver potrebbero dover essere eseguiti senza incorrere in errori di pagina. Mettere la memoria del driver nel kernel è un modo semplice per farlo. (In realtà, questo è, ovviamente, molto più complicato: di solito i driver hanno una piccola quantità di codice ad alta priorità, insieme ad un codice aggiuntivo meno critico che viene eseguito anche nel kernel e alle due condivisioni di memoria.)
- Le istruzioni di I / O e gli indirizzi di I / O mappati nella memoria del dispositivo sono generalmente protetti dal codice dell'applicazione, pertanto le applicazioni non possono accedere direttamente a tali risorse. Costringere le applicazioni a utilizzare chiamate kernel / sistema consente al sistema operativo di condividere dispositivi tra più applicazioni o persino più macchine virtuali.
- Le applicazioni che utilizzano un'interfaccia di lettura / scrittura kernel / sistema per accedere ai dispositivi consentono la sostituzione dei dispositivi e l'aggiornamento dei driver dei dispositivi indipendentemente dall'applicazione.
Le applicazioni, di solito, vengono eseguite in modalità utente, con un grado di astrazione dai dispositivi sottostanti e la loro implementazione.
I mean when my application communicated directly with the USB driver, it was running in user mode.
Sì, ma la comunicazione dell'applicazione con il driver USB viene effettuata tramite chiamate kernel / di sistema, quindi il kernel è coinvolto in questo. Inoltre, il driver USB stesso è tipicamente nel kernel; solo le routine di libreria per accedervi sono nell'applicazione o nelle librerie utilizzate dall'applicazione.
Se si scrive il proprio driver di dispositivo, è possibile inserire tutte le funzionalità dell'applicazione nel driver di dispositivo e quindi non richiedere affatto un'applicazione in modalità utente. Tuttavia, generalmente non è una grande strutturazione della funzionalità per una serie di motivi. Ad esempio, linee guida come Separation of Concerns sarebbero state violate.