Perché i driver di periferica in Linux devono essere eseguiti in modalità kernel?

0

Supponiamo di avere un dispositivo collegato al computer tramite una porta USB e ho creato un'applicazione per comunicare con questo dispositivo. In questa applicazione ho usato il driver USB per comunicare con il dispositivo.

Successivamente ho deciso che non desideravo che la mia applicazione comunichi direttamente con il driver USB, quindi ho rimosso il codice che comunica con il driver USB dalla mia applicazione e ho creato un driver di periferica che contiene questo codice, quindi ora la mia applicazione comunicherà con il nuovo driver di dispositivo.

Ora ho letto che i driver di dispositivo in Linux devono essere eseguiti in modalità kernel. Ma perché è così?

Voglio dire quando la mia applicazione comunicava direttamente con il driver USB, era in esecuzione in modalità utente. Quindi, perché quando ho spostato il codice che comunica con il driver USB al driver del dispositivo, ora il driver del dispositivo deve essere eseguito in modalità kernel, perché il driver del dispositivo non può essere eseguito anche in modalità utente?

    
posta John 29.05.2017 - 00:39
fonte

3 risposte

3

Il codice spostato potrebbe ancora essere eseguito in userland, semplicemente non sarebbe un driver, sarebbe una libreria o simile. Credo che il tuo cosiddetto driver sia erroneamente chiamato e non sia in realtà un driver, solo una libreria condivisa intermedia o qualcosa di simile.

I driver di dispositivo sono in grado di accedere a funzioni privilegiate e hanno accesso a roba che il software per utenti non lo è. Questo è il motivo per cui devono essere in modalità kernel. Questo è anche il motivo per cui sono più scrutati e più difficili da caricare ed eseguire, a causa dei problemi che potrebbero causare. I driver Dodgy sono in grado di eseguire il deadlock di un sistema e possono rendere il sistema instabile, senza che il sistema operativo lo possa arrestare.

Se si dispone di un set di codice che non richiede tale accesso privilegiato, è inutile crearlo in un driver. Sarebbe come cercare di ottenere un permesso di costruzione prima di spostare i mobili, un sacco di problemi senza alcun beneficio.

    
risposta data 29.05.2017 - 01:06
fonte
2

I driver di dispositivo non devono essere eseguiti in modalità kernel in Linux. È perfettamente possibile eseguire i driver in modalità utente.

Ad esempio, lo scopo della libreria libusb è di scrivere driver USB indipendenti dal sistema operativo in modalità utente. Quasi tutti i driver di stampa sono in modalità utente. Parti dello stack grafico sono in modalità utente (anche se la quantità di esso e dove i limiti tendono a spostarsi ogni 10-15 anni). Lo scopo di FUSE è di scrivere i driver del file system in modalità utente.

Se stai chiedendo più in generale perché i driver di dispositivo devono essere in modalità kernel, la risposta è: non lo fanno. Nei kernel monolitici come Linux, tendono ad esserlo, ma per esempio nei microkernel, solo una minima funzionalità (memoria virtuale, pianificazione delle attività) è fornita dal kernel e tutto il resto è implementato nello spazio utente. In nanokernels ed exokernels anche meno è nel kernel: in pratica, l'unica cosa che fa il kernel è sequenziare l'accesso alle risorse. Non gestisce nemmeno la memoria.

E per ultimo, ma non meno importante, esistono sistemi operativi senza kernel, in cui non esiste nemmeno un kernel: tutto viene eseguito nello spazio utente.

    
risposta data 29.05.2017 - 02:21
fonte
1

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.

    
risposta data 29.05.2017 - 01:05
fonte

Leggi altre domande sui tag