Beskrivelse
La oss starte diskusjonen med karakterføreren i Linux. Kernel kategoriserer driverne i tre kategorier:
Karakterdrivere - Dette er driverne som ikke har for mye data å håndtere. Få eksempler på karakterførere er driver med berøringsskjerm, UART -driver osv. Disse alle er karakterdriverne siden dataoverføringen gjøres gjennom karakter etter karakter.
Blokkerer drivere - Dette er driverne som omhandler for mye data. Dataoverføring gjøres blokkering av blokkering siden for mye av dataene må overføres. Eksempel på blokkeringsførere er SATA, NVME, etc.
Nettverksdrivere - Dette er driverne som fungerer i nettverksgruppen til drivere. Her gjøres dataoverføring i form av datapakker. Trådløse drivere som ateros kommer under denne kategorien.
I denne diskusjonen vil vi bare fokusere på karakterdriver.
Som et eksempel vil vi ta den enkle lese-/skriveoperasjonene for å forstå den grunnleggende karakterdriveren. Generelt har enhver enhetsdriver disse to minimumsoperasjonene. Ytterligere drift kan være åpen, nær, ioctl osv. I vårt eksempel har sjåføren vår minnet i kjerneområdet. Dette minnet tildeles av enhetsdriveren og kan betraktes som enhetsminnet siden det ikke er noen maskinvarekomponent involvert. Driveren oppretter enhetsgrensesnittet i /dev -katalogen som kan brukes av brukerromsprogrammene for å få tilgang til driveren og utføre operasjonene som støttes av driveren. For brukerpace -programmet er disse operasjonene akkurat som alle andre filoperasjoner. Brukerplassprogrammet må åpne enhetsfilen for å få forekomsten av enheten. Hvis brukeren ønsker å utføre leseoperasjonen, kan lesesystemanropet brukes til å gjøre det. Tilsvarende, hvis brukeren ønsker å utføre skriveoperasjonen, kan skrivesystemanropet brukes til å oppnå skriveoperasjonen.
Karakterdriver
La oss vurdere å implementere karakterdriveren med Read/Writ Data Operations.
Vi starter med å ta forekomsten av enhetsdataene. I vårt tilfelle er det “struct cdrv_device_data”.
Hvis vi ser feltene i denne strukturen, har vi CDEV, enhetsbuffer, størrelse på buffer, klasseforekomst og enhetsobjekt. Dette er minimumsfeltene der vi skal implementere karakterdriveren. Det avhenger av implementeren av hvilke tilleggsfelt vil han legge til for å forbedre driverens funksjon. Her prøver vi å oppnå minimumsfunksjonen.
Deretter bør vi lage objektet med enhetsdatastrukturen. Vi bruker instruksjonen for å tildele minnet på statisk måte.
struct cdrv_device_data char_device [cdrv_max_minors];
Dette minnet kan også tildeles dynamisk med “Kmalloc”. La oss holde implementeringen så enkel som mulig.
Vi bør ta implementeringen av lese- og skrivefunksjonene. Prototypen til disse to funksjonene er definert av enhetsdriverens rammeverk av Linux. Implementeringen av disse funksjonene må være brukerdefinert. I vårt tilfelle vurderte vi følgende:
Les: Operasjonen for å få dataene fra driverminnet til brukerområdet.
statisk ssize_t cdrv_read (struct file *fil, char __user *user_buffer, størrelse_t størrelse, LOFF_T *offset);
Skriv: Operasjonen for å lagre dataene til driverminnet fra brukerområdet.
statisk ssize_t cdrv_write (struct file *fil, const char __user *user_buffer, størrelse_t størrelse, LOFF_T *offset);
Begge operasjonene, lese og skrive, må registreres som en del av struct File_Operations CDRV_FOPS. Disse er registrert på Linux Device Driver Framework i INIT_CDRV () til driveren. Inne i init_cdrv () -funksjonen utføres alle oppsettoppgaver. Få oppgaver er som følger:
Den komplette eksempelkoden for den grunnleggende karakterenheten Driver er som følger:
#inkludereVi lager et eksempel på makefile for å kompilere den grunnleggende karakterdriveren og testappen. Driverkoden vår er til stede i CRDV.C og testappkoden er til stede i CDRV_APP.c.
OBJ-M+= CDRV.oEtter at utstedelsen er gjort til makefilen, bør vi få følgende logger. Vi får også CDRV.KO og kjørbar (CDRV_APP) for testappen vår:
root@haxv-srathore-2:/home/cienauser/kjerne_artikler# lageHer er prøvekoden for testappen. Denne koden implementerer testappen som åpner enhetsfilen som er opprettet av CDRV -driveren og skriver “testdata” for den. Deretter leser den dataene fra driveren og skriver dem ut etter å ha lest dataene som skal skrives ut som "Testdata".
#inkludereNår vi har alle tingene på plass, kan vi bruke følgende kommando for å sette inn den grunnleggende karakterdriveren til Linux -kjernen:
root@haxv-srathore-2:/home/cienauser/kernel_articles# insmod cdrv.koEtter å ha satt inn modulen, får vi følgende meldinger med DMESG og få enhetsfilen opprettet i /dev as /dev /cdrv_dev:
root@haxv-srathore-2:/home/cienauser/kjerne_artikler# dmesgUtfør nå testappen med følgende kommando i Linux -skallet. Den endelige meldingen skriver ut lesedataene fra driveren som er nøyaktig det samme som det vi skrev i skriveoperasjonen:
root@haxv-srathore-2:/home/cienauser/kjerne_artikler# ./cdrv_appVi har få ekstra utskrifter i skrive- og lesestien som kan sees ved hjelp av DMESG -kommandoen. Når vi utsteder DMESG -kommandoen, får vi følgende utdata:
root@haxv-srathore-2:/home/cienauser/kjerne_artikler# dmesgKonklusjon
Vi har gått gjennom den grunnleggende karakterdriveren som implementerer de grunnleggende skrive- og leseoperasjonene. Vi diskuterte også eksemplet Makefile for å kompilere modulen sammen med testappen. Testappen ble skrevet og diskutert for å utføre skrive- og leseoperasjonene fra brukerområdet. Vi demonstrerte også samlingen og utførelsen av modulen og testappen med logger. Test -appen skriver få byte av testdata og leser den tilbake. Brukeren kan sammenligne både dataene for å bekrefte riktig funksjon av driver- og testappen.