Linux Device Driver Tutorial for nybegynnere

Linux Device Driver Tutorial for nybegynnere
Linux -operativsystemet inneholder 3 hoveddeler: rotfilsystem, kjerne og bootloader.

Rotfilsystem:

Denne delen av operativsystemet inneholder applikasjonsbinarier, biblioteker, skript, konfigurasjonsfiler og lastbare modulfiler osv. ..

Kjerne:

Denne delen er hjertet av OS, kjernen er ansvarlig for å håndtere alle operasjoner som trengs for å kjøre operativsystemet som minnestyring, prosessstyring og inngangs-/utgangsmaskinvareoperasjoner osv. ..

Bootloader:

Dette er den første delen som blir henrettet av CPU på oppstart. Bootloader inneholder kildekoden for å initialisere systemet og begynne å utføre kjernen og inneholder kommandoer for feilsøking og modifisering.

Drivere fungerer som en bro mellom maskinvare og en brukerapplikasjon, kjernen gir en mekanisme som heter systemanrop for å snakke med kjernen. I Linux kan sjåfører implementeres på to måter, en er sjåfører kan settes sammen som en del av kjernen og en annen er at drivere kan kompileres som moduler og lastes ved kjøretid.

La oss starte med en enkel Hello World Kernel -modul. Her er kildekoden for en enkel Hello World Kernel -modul.

Hallo.c

#include // nødvendig for module_init og module_exit
#include // nødvendig for kern_info
#include // nødvendig for makroene
int __init hw_init (ugyldig)
printk (Kern_info "Hello World \ n");
retur 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: = Hei.o
alle:
lage -c/lib/modules/$ (shell uname -r)/build m = $ (pwd) moduler
ren:
lage -c/lib/modules/$ (shell uname -r)/build m = $ (pwd) ren

Opprett en mappe som heter Hallo og plasser deretter Hallo.c og Makefile inni det. Åpne terminal Applikasjon og endre katalog til hei. Kjør nå kommandoen gjøre og hvis det er vellykket, bør den generere lastbar kjernemodulfil som heter Hallo.ko.

Når du kjører, gjør du hvis du får utdata Make: Ingenting som skal gjøres for 'alle'. Så sørg for at du i makefilen har lagt inn fanen (ingen mellomrom) før Make -C. Hvis det er vellykket, bør du få utdataene som vist nedenfor.

MAKE [1]: Å legge inn katalog '/usr/src/linux-headers-3.1. 3.0-128-generisk '
CC [M]/Home/John/Desktop/Hallo/Hallo.o
Bygningsmoduler, trinn 2.
Modpost 1 -moduler
CC/Home/John/Desktop/Hallo/Hallo.mod.o
LD [M]/Home/John/Desktop/MVS/Pers/Kern/Hallo/Hallo.ko
Make [1]: Leaving Directory '/usr/src/Linux-headers-3.1. 3.0-128-generisk '

La oss nå teste modulen ved å laste den inn i kjernen. For lasting og lossing av kjernemoduler må vi ha superbruker tillatelse. Bruk følgende kommando for å laste inn kjernemodulen i kjernen.

Sudo Insmod Hei.ko

For å se PRINTK -meldingen må du sjekke kjerneloggen, for å sjekke kjerneloggen Bruk følgende kommando.

dmesg

Denne kommandoen vil sende ut kjerne loggmeldinger, på slutten skal du se at meldingen vår Hei Verden skrevet ut.

For å losse modulen, bruk følgende kommando.

sudo rmmod hei

For å se Printk -meldingen bruke DMESG -kommandoen igjen og i kjerneloggen kan du se meldingen vår Bye verden.

La oss nå forstå kildekoden.

Hallo.c

For å begynne å skrive kjernen Driver kan du bruke hvilken som helst redaktør eller IDE etter eget valg, men ofte foretrekker kjerneutviklere vi redaktør.

Hver kjernemodul skal inneholde overskriftsfilen Linux/modul.h Dette har erklæringene og makroene for kjernefunksjoner som for eksempel module_init og MODULE_EXIT etc. De to mest nødvendige funksjonene for en kjernedriver er module_init og module_exit -funksjoner. Funksjonen hvis peker sendes til module_init vil bli utført når vi laster modulen i kjernen, og funksjonen hvis pekeren sendes til module_exit vil bli kalt når vi loss eller fjerner modulen fra kjernen.

Inne i kjernen for å feilsøke og skrive ut loggen, bruker vi printk funksjon som ligner på printf -funksjonen som vi bruker i applikasjonen. Du kan bruke makroene som Kern_info, Kern_err osv. ... for å spesifisere et loggnivå.

Hvis vi skriver en driver for å snakke med en spesifikk maskinvare, bør INIT -funksjonen ha koden for å initialisere maskinvaren før vi begynner å bruke den og avslutte funksjonen, skal ha en kode for å rydde opp i ressurser (dynamisk minne osv.) Vi brukte i driveren Før vi går ut fra kjernen.

Her i dette eksemplet skriver vi bare ut feilsøkingsmeldinger i init- og exit -funksjoner.

Makefile

For å bygge kjernemodulen må vi skrive en makefil som vil guide gjøre Utility hvordan du kan kompilere modulen. Syntaks obj-m brukes til å fortelle kjernen Makefile at driveren må kompileres som modul ved hjelp av den spesifiserte objektfilen. Når du bare kjører kommando gjøre Da kommer kontrollen til alle: delen av makefilen og hvis du kjører kommandoen Gjør rent Da går kontrollen til ren: del av Makefile. Fra denne makefilen kjører vi faktisk Make Inside the Kernel Source Directory ved hjelp av alternativ -C. Forsikre deg om at du har installert Kernel Source Directory i systemet ditt. Her i dette eksemplet brukte vi kommandoen uname -r For å finne den nåværende versjonen av systemets Linux -kjerne.

Vi har brukt alternativ m = $ (pwd) for å indikere i kjernen makefile at kilden for driver er i nåværende arbeidskatalog og vi spesifiserer ordet moduler å fortelle kjernemakefilen å bare bygge moduler og ikke å bygge den komplette kjernekildekoden. I ren: Seksjon av Makefile Vi ber kjerne Makefile å rengjøre objektfilene som genereres for å bygge denne modulen.

Dette hvis du kommer i gang med å samle og kjøre din første kjernemodul.