Tutorial del driver del dispositivo Linux per principianti

Tutorial del driver del dispositivo Linux per principianti
Il sistema operativo Linux contiene 3 sezioni principali: file system, kernel e bootloader.

File system root:

Questa parte del sistema operativo contiene binari dell'applicazione, librerie, script, file di configurazione e file di moduli carichi di kernel ecc ..

Kernel:

Questa parte è il cuore del sistema operativo, il kernel è responsabile della gestione di tutte le operazioni necessarie per eseguire il sistema operativo come gestione della memoria, gestione dei processi e operazioni hardware di input/output ecc ..

Boot loader:

Questa è la prima parte ad essere eseguita dalla CPU al boot. BootLoader contiene il codice sorgente per inizializzare il sistema e avviare eseguire il kernel e contiene comandi per il debug e la modifica dell'ambiente del kernel, contiene anche i comandi per scaricare e aggiornare le immagini del kernel e del sistema nella memoria flash.

I conducenti fungono da ponte tra hardware e un'applicazione utente, il kernel fornisce un meccanismo chiamato System Calls per parlare con il kernel. In Linux, i driver possono essere implementati in due modi, uno è che i driver possono essere compilati come parte del kernel e un altro è che i driver possono essere compilati come moduli e caricati in fase di esecuzione.

Cominciamo con un semplice modulo Kernel Hello World. Ecco il codice sorgente per un semplice modulo Kernel Hello World.

Ciao.C

#include // necessario per module_init e module_exit
#include // necessario per kern_info
#include // necessario per le macro
int __init hw_init (void)
printk (Kern_info "Hello World \ n");
restituzione 0;

void __exit hw_exit (void)
printk (kern_info "bye world \ n");

Module_license ("GPL");
module_init (hw_init);
module_exit (hw_exit);

Makefile

obj-m: = ciao.o
Tutto:
make -c/lib/moduli/$ (shell uname -r)/build m = $ (pwd) moduli
pulito:
fare -c/lib/moduli/$ (shell uname -r)/build m = $ (pwd) pulito

Crea una cartella denominata Ciao e poi posizionare il Ciao.C E Makefile dentro. Apri il terminale Directory di applicazione e modifica su ciao. Ora esegui il comando Fare e se ha esito positivo, dovrebbe generare un file di moduli del kernel carico chiamato Ciao.ko.

Quando si esegue Make se ottieni l'output Make: Niente da fare per "All". Quindi assicurati che nel makefile sia stato inserito nella scheda (nessun spazi) prima di make -c. Se la creazione ha successo, dovresti ottenere l'output come mostrato di seguito.

Make [1]: immettere la directory '/usr/src/linux-headers-3.13.0-128-generico '
CC [M]/Home/John/Desktop/Hello/Hello.o
Moduli di costruzione, Fase 2.
Moduli Modpost 1
CC/Home/John/Desktop/Hello/Hello.mod.o
LD [M]/Home/John/Desktop/Mvs/Pers/Kern/Hello/Hello.ko
Make [1]: Leaving Directory '/USR/SRC/Linux-Headers-3.13.0-128-generico '

Ora tesiamo il modulo caricandolo nel kernel. Per il caricamento e lo scarico dei moduli del kernel è necessario avere un autorizzazione superuser. Utilizzare il comando seguente per caricare il modulo del kernel nel kernel.

sudo insmod ciao.ko

Per visualizzare il messaggio printk è necessario controllare il registro del kernel, per controllare il registro del kernel utilizzare il comando seguente.

dmesg

Questo comando emetterà i messaggi di registro del kernel, alla fine dovresti vedere che il nostro messaggio Ciao mondo stampato.

Per scaricare il modulo usa il comando seguente.

sudo rmod ciao

Per vedere il messaggio printk usa di nuovo il comando dmesg e nel registro del kernel puoi vedere il nostro messaggio Ciao mondo.

Ora facciamo capire il codice sorgente.

Ciao.C

Per iniziare a scrivere il driver del kernel è possibile utilizzare qualsiasi editor o IDE a tua scelta, ma gli sviluppatori del kernel più comunemente preferiscono utilizzare vi editore.

Ogni modulo del kernel dovrebbe includere il file di intestazione Linux/Modulo.H Questo ha le dichiarazioni e le macro per le funzioni del kernel come module_init E module_exit eccetera. Le due funzioni più necessarie per un driver del kernel sono le funzioni Module_Init e Module_Exit. La funzione il cui puntatore viene passato a Module_Init verrà eseguita quando cariciamo il modulo nel kernel e la funzione il cui puntatore viene passato a Module_Exit verrà chiamata quando scarichiamo o rimuoviamo il modulo dal kernel.

All'interno del kernel per il debug e la stampa del registro, utilizziamo printk funzione che è simile alla funzione printf che utilizziamo nell'applicazione. È possibile utilizzare le macro come Kern_info, Kern_err ecc ... per specificare un livello di registro.

Se stiamo scrivendo un driver per parlare con un hardware specifico, la funzione init dovrebbe avere il codice per inizializzare l'hardware prima di iniziare a usarlo e la funzione di uscita dovrebbe avere un codice per ripulire le risorse (memoria dinamica ecc.) Abbiamo usato nel driver Prima di uscire dal kernel.

Qui in questo esempio, stiamo solo stampando i messaggi di debug nelle funzioni INIT e EXIT.

Makefile

Per la costruzione del modulo del kernel dobbiamo scrivere un makefile che guiderà Fare utilità come compilare il modulo. La sintassi OBJ-M viene utilizzato per dire al kernel makefile che il driver deve essere compilato come modulo utilizzando il file oggetto specificato. Quando esegui il comando Fare Quindi il controllo arriva al Tutto: sezione del makefile e se si esegue il comando Rendi pulito Quindi il controllo va al pulito: sezione di makefile. Da questo makefile stiamo effettivamente eseguendo Make all'interno della directory della sorgente del kernel usando l'opzione -c. Assicurati di avere la directory di origine del kernel installata nel sistema. Qui in questo esempio abbiamo usato il comando UNAME -R Per trovare la versione corrente del kernel Linux del sistema.

Abbiamo usato l'opzione m = $ (PWD) per indicare nel kernel makefile che la fonte per il driver è nella directory di lavoro attuale e stiamo specificando la parola moduli per dire al kernel makefile di costruire solo moduli e non costruire il codice sorgente del kernel completo. In pulito: sezione di makefile stiamo dicendo al kernel makefile di pulire i file oggetto generati per creare questo modulo.

Questo se dovessi iniziare a compilare e eseguire il tuo primo modulo kernel.