Scrittura di moduli (driver) sotto Linux

      Nessun commento su Scrittura di moduli (driver) sotto Linux

Introduzione

Uno dei molti vantaggi del Sistema Operativo Linux è che il suo “interno” è aperto a tutti. Il kernel Linux è un corpo grande e complesso di codice. I drivers di periferica, sono distinte “scatole nere” che fanno sì che un particolare pezzo di hardware risponda ad un interfaccia di programmazione ben definita. Le attività dell’utente sono effettuate tramite una serie di chiamate standardizzate indipendenti dal driver specifico. Quindi i driver possono essere costruiti separatamente dal resto del kernel e “inseriti” a runtime quando necessario.

Ruolo dei dispositivi di periferica

Come programmatore, si è in grado di fare le proprie scelte circa il driver, e scegliere un accettabile compromesso tra il tempo di programmazione richiesto e la flessibilità del risultato, ovvero il ruolo di un driver di periferica fornisce il meccanismo, non la politica. La maggior parte dei problemi di programmazione possono infatti essere divise in due parti: “quali funzionalità devono essere forniti” (il meccanismo) e “come possono essere utilizzate quelle capacità” (la politica). Esempio, la gestione Unix del display grafico è diviso tra il server X, che conosce l’hardware e offre un’interfaccia unificata per programmi utente, e il gestore delle finestre e di sessione, che implementano una particolare politica senza sapere nulla l’hardware. Gli utenti possono utilizzare lo stesso gestore di finestre su hardware diversi, e viceversa diversi utenti possono eseguire diverse configurazioni sulla stessa workstation. È inoltre possibile guardare il driver da una prospettiva diversa: si tratta di uno strato di software che si trova tra le applicazioni e il dispositivo vero e proprio. Caratteristiche tipiche: Queste includono il supporto per entrambi funzionamento sincrono e asincrono, la capacità di essere aperto più volte, la capacità di sfruttare tutte le funzionalità dell’hardware, e la mancanza di strati di software a “semplificare le cose” o fornire le operazioni legate alla politica.

Kernel Linux

Gestione dei processi: Il kernel si occupa della creazione e distruzione dei processi, della loro comunicazione. Gestione della memoria: Le varie parti del kernel interagiscono con il sottosistema di gestione della memoria attraverso una serie di chiamate di funzione, che vanno dal semplice malloc ad altre più complesse. Filesystem: quasi tutto in Unix può essere trattato come un file. Il kernel costruisce un file system strutturato in cima hardware non strutturato, e la conseguente estrazione di file è molto utilizzato in tutto il sistema. Controllo dispositivi funzionamento: a quasi tutti i sistemi è associato un dispositivo fisico. Con l’eccezione del processore, memoria e poche altre entità, qualsiasi e tutte le operazioni di controllo del dispositivo vengono eseguite da codice (Driver di periferia) che è specifico per il dispositivo. Il kernel deve avere incorporato un device driver per ogni periferica presente sul sistema, dal disco rigido alla tastiera e l’unità a nastro. Networking: deve essere gestita dal sistema operativo, perché la maggior parte delle operazioni di rete non sono specifici di un processo: i pacchetti in ingresso sono eventi asincroni. I pacchetti devono essere raccolti, identificati e spediti prima che un processo si prenda cura di loro. Inoltre, tutti i problemi di risoluzione di routing e di indirizzo sono implementati all’interno del kernel.

kernel_linux

I Moduli

Le Classi di dispositivie moduli

  • Character devices Un dispositivo a caratteri (char) può essere letto come un flusso di byte (come un file); Ai dispositivi Char si accede per mezzo di nodi del file system. L’unica differenza rilevante tra un dispositivo char e un file normale è che si può sempre spostare avanti e indietro nel file regolare, mentre la maggior parte dei dispositivi char sono canali di dati solo, e quindi si può solo accedere in modo sequenziale. Esistono, tuttavia, i dispositivi char che sembrano aree dati, e ci si può spostare avanti e indietro.
  • I dispositivi a blocchi: Un dispositivo a blocchi è un dispositivo (ad esempio, un disco) che può ospitare un filesystem. Nella maggior parte dei sistemi Unix, un dispositivo di blocco può gestire solo operazioni I / O che consentono di trasferire uno o più blocchi interi, che sono di solito 512 byte di lunghezza. Linux, invece, consente all’applicazione di leggere e scrivere un dispositivo a blocchi, come un dispositivo char e quindi permette il trasferimento di un qualsiasi numero di byte alla volta.
  • Le interfacce di rete: è incaricato di inviare e ricevere pacchetti di dati, guidato dal sottosistema di rete del kernel, senza sapere come le singole operazioni mappano i pacchetti da trasmettere. Molte le connessioni di rete (in particolare quelli che utilizzano il protocollo TCP) sono stream-oriented, ma i dispositivi di rete sono, in genere, progettati intorno la trasmissione e la ricezione di pacchetti. Un driver di rete non sa nulla di singole connessioni; gestisce solo i pacchetti. Il kernel per comunicare con un driver di dispositivo di, chiama le funzioni relative alla trasmissione dei pacchetti.
  • USB: il dispositivo stesso si presenta nel sistema come un dispositivo char (una porta seriale USB, per esempio), un dispositivo a blocchi (un lettore di schede di memoria USB), o un dispositivo di rete (un’interfaccia Ethernet USB)

Problemi di sicurezza

Nella distribuzione ufficiale del kernel, solo un utente autorizzato può caricare moduli; la chiamata di sistema init_module controlla se il processo chiamante è autorizzato a caricare un modulo nel kernel.

Moduli caricabili

Una delle buone caratteristiche di Linux è la possibilità di estendere in fase di esecuzione l’insieme delle funzionalità offerte dal kernel. Ciò significa che….

download_button