Legge til modul til kjernen

Legge til modul til kjernen
Vi vil gå gjennom prosessen eller trinnene som kreves for å legge til en kjernemodul mens kjernen kjører. Vi vil også diskutere de få nyttige Linux -verktøyene som er tilgjengelige. Disse verktøyene kan brukes for å få informasjon om modulen som allerede er til stede i Linux -kjernen, legg til en ny modul og få informasjonen på den medfølgende modulen.

Beskrivelse

La oss starte med kjernemodulen; Kjernemodulen er den logiske separate funksjonaliteten som kan legges til på et senere tidspunkt i løpekjernen. Dette utvider Linux -kjernen/funksjonene.

Disse modulene er filer med utvidelsen som ".ko ”, som betyr kjerneobjekter. Hvis vi kommer over noen fil med ".KO ”som en utvidelse indikerer det tydelig at det er en kjernemodul.

Noen få eksempel på moduler er: I2C-moduler.Ko, hei-verden.KO, osv.

Prosessen med å legge til en kjernemodul til kjernen er også kjent som lasting av en kjernemodul. Kjernemodulen kan bare lastes inn hvis den er kompatibel med kjernekilde -treet. Dette betyr at kjernemodulen ikke er plattformuavhengig. Disse kan bare lastes på kjernen med samme kildetre og bygge konfigurasjon.

Legge til/lasting av kjernemodulen

Linux gir et verktøy kjent som “Insmod”. Dette er verktøyet som kan brukes til å laste inn kjernemodulen på den løpende kjernen.

For å laste inn kjernemodulen, er det bare å utføre kommandoen som InsMod etterfulgt av modulfilnavnet.

La oss ta et eksempel på Hello-World.KO, en modul som er det klassiske eksemplet og bare skriver ut Hello World -meldingen. For å laste inn Hello-World Kernel-modulen, nedenfor er kommandoen som kan brukes:

Et eksempel på øyeblikksbilde er festet nedenfor; uthevet fil er kjernemodulen:

$ sudo insmod hallo-world.ko

Eksempel på øyeblikksbilde:

Med kommandoens vellykkede utførelse blir vår modul lagt til Linux-kjernen, og vi vil se utskriftsmeldingen fra Hello-World Kernel-modulen i Printk-bufferen. For å sjekke meldingen fra Hello-World, bruk DMESG-kommandoen. Hvis kommandoen resulterer i ingen feilmelding, kan den betraktes som moduladduksjon er vellykket. Når vi utvider kjernefunksjonene, så krever det superbrukerrettigheter for å utføre "Insmod". Eksempelutgang fra DMESG -kommandoen er som nedenfor:

Sushilrathore-2: ~/Hello-World $ Sudo Insmod Hello-World.ko
Sushilrathore-2: ~/Hello-World $ dmesg
[10500712.434672] Hei verden
cienauser@haxv-srathore-2: ~/hallo-world $

Bekreftelse av modulen er lastet

For å bekrefte om modulen er lastet og er til stede mellom de andre modulene i Linux -kjernen. Kommandoen “LSMOD” kan brukes til å liste opp alle kjernemodulene. Utsted kommandoen på Linux -skallet, så ser vi den komplette listen over de lastede modulene i Linux -kjernen. Utstedelse av LSMOD på systemet mitt, jeg ser utdataene nedenfor ved konsollen:

Sushilrathore-2: ~/Hello-World $ lsmod
Modulstørrelse brukt av
Hello_world 16384 0
NF_CONNTRACK_IPV6 20480 0
NF_DEFRAG_IPV6 20480 1 NF_CONNTRACK_IPV6
ip6table_filter 16384 0
ip6_tables 28672 1 ip6table_filter
NF_CONNTRACK_IPV4 16384 0
NF_DEFrag_IPV4 16384 1 NF_CONNTRACK_IPV4
XT_RECENT 20480 0
XT_CONNTRACK 16384 0
NF_CONNTRACK 135168 3 XT_CONNTRACK, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
CPUID 16384 0
iptable_filter 16384 1
IPMI_DEVINTF 20480 0
IPMI_MSHANDLER 53248 1 IPMI_DEVINTF

Som vi kan se i loggene ovenfor, er det mange moduler oppført, og modulen vår Hello-World er også på listen; Og jeg har fremhevet det for enkel flekk.

Så vi bekreftet at modulen vår er lastet i kjernen med hell.

Fjerne/losse kjernemodulen

For å fjerne eller losse kjernemodulen, kan vi bruke Linux -kommandoen “RMMOD”. Dette er kommandoen som brukes til å fjerne den lastede kjernemodulen og oppført av LSMOD. Denne operasjonen krever også superbrukerrettigheter. Går tilbake til vårt Hello-World-eksempel, hvis vi ønsker å fjerne Hello-World Kernel-modulen som vi har lastet inn tidligere. Vi må utstede kommandoen nedenfor:

Sushilrathore-2: ~/Hello-World $ Sudo RmMod Hello_World
Sushilrathore-2: ~/Hello-World $

Etter utførelsen av kommandoen, hvis ingenting blir sett på konsollen, jeg.e. Det er ingen feilmelding. Dette betyr at lossing/fjerning av kjernemodulen er vellykket.

Bekreftelse av fjerning/lossing av modulen

Igjen for å bekrefte om modulen er losset med hell, kan vi bruke LSMOD -kommandoen. Etter fjerning av kjernemodulen, skal vi ikke se modulen til stede i listen over moduler levert av "LSMOD".

Følgende er eksempelutgangen fra systemet mitt:

Sushilrathore-2: ~/Hello-World $ lsmod
Modulstørrelse brukt av
NF_CONNTRACK_IPV6 20480 0
NF_DEFRAG_IPV6 20480 1 NF_CONNTRACK_IPV6
ip6table_filter 16384 0
ip6_tables 28672 1 ip6table_filter
NF_CONNTRACK_IPV4 16384 0
NF_DEFrag_IPV4 16384 1 NF_CONNTRACK_IPV4
XT_RECENT 20480 0
XT_CONNTRACK 16384 0
NF_CONNTRACK 135168 3 XT_CONNTRACK, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
CPUID 16384 0
iptable_filter 16384 1
IPMI_DEVINTF 20480 0
IPMI_MSHANDLER 53248 1 IPMI_DEVINTF
VMW_VSOCK_VMCI_TRANSPORT 32768 1
VSOCK 36864 2 VMW_VSOCK_VMCI_TRANSPORT
binfmt_misc 20480 1
Intel_RAPL_PERF 16384 0
Joydev 24576 0
input_leds 16384 0
VMW_BALLOON 20480 0
SERIO_RAW 16384 0
SHPCHP 36864 0
VMW_VMCI 69632 2 VMW_BALLOON, VMW_VSOCK_VMCI_TRANSPORT

I listen over, hvis vi sjekker, vil vi ikke finne Hello-World Kernel-modulen. Denne doble bekrefter at modulen fjernes fra systemet.

Det er et veldig viktig verktøy som tilbys, som kan brukes til å få informasjonen i kjernemodulfilen. “Modinfo” er kommandoen som er gitt for å få detaljene i den allerede tilstedeværende kjernemodulen.

Utførelse av "Modinfo" med Hello-World Kernel-modulen får vi utdataene nedenfor:

Sushilrathore-2: ~/Hello-World $ Modinfo Hello-World.ko
Filnavn:/Home/Sushilrathore/Hello-World/Hello-World.ko
Beskrivelse: Hei verden!
Lisens: GPL
SrcVersion: BBD5A60063B15C8D80048FD
Avhenger:
Retpoline: y
Navn: Hello_World
Vermagic: 4.15.0-163-generiske SMP mod_unload modversions
cienauser@haxv-srathore-2: ~/hallo-world $

Ovennevnte informasjon er detaljene i kjernemodulen. Den viktige informasjonen å merke seg er at den gir deg srcversion og vermagic. Denne informasjonen kan brukes til å identifisere kjernen som denne modulen er kompatibel og kan lastes inn i. Hvis vi prøver å legge til kjernemodulen som.

Nedenfor er prøvekoden og makefilkoden vi har brukt i diskusjonen vår over:

Hei Verden.c

#inkludere
#inkludere
#inkludere
Module_license ("gpl");
Module_description ("Hello World!");
statisk int __inithello_init (ugyldig)

printk (Kern_info "Hello World \ n");
return 0;

statisk tomrom __exit hello_exit (ugyldig)

printk (Kern_info "Goodbye World \ n");

module_init (hello_init);
module_exit (hello_exit);

Makefile

OBJ-M = Hello-World.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

Konklusjon

Så langt har vi diskutert om den lastbare kjernemodulene prosess/trinn for å legge til kjernemodulen. InsMod er kommandoen vi diskuterte for å laste inn kjernemodulen. For å bekrefte om modulen er lastet med suksess, kan vi bruke LSMOD -kommandoen og til slutt for å fjerne RMMOD -kommandoen kan brukes. Det er ett verktøysmodinfo til som kan brukes til å skrive ut detaljene i kjernemodulen.