GNU/Linux >> Linux Esercitazione >  >> Linux

Come scrivere il tuo modulo del kernel Linux con un semplice esempio

Cosa sono i moduli del kernel?

I moduli del kernel sono parti di codice che possono essere caricate e scaricate dal kernel su richiesta.

I moduli del kernel offrono un modo semplice per estendere la funzionalità del kernel di base senza dover ricostruire o ricompilare nuovamente il kernel. La maggior parte dei driver sono implementati come moduli del kernel Linux. Quando quei driver non sono necessari, possiamo scaricare solo quel driver specifico, il che ridurrà le dimensioni dell'immagine del kernel.

I moduli del kernel avranno un'estensione .ko. Su un normale sistema Linux, i moduli del kernel risiederanno all'interno della directory /lib/modules//kernel/.

In precedenza abbiamo discusso su come compilare un kernel dal sorgente.

Questo tutorial spiega come scrivere un modulo del kernel usando un semplice esempio di Hello World.

Io. Utilità per manipolare i moduli del kernel

1. lsmod – Elenca i moduli già caricati

Il comando lsmod elencherà i moduli che sono già caricati nel kernel come mostrato di seguito.

# lsmod
Module                  Size  Used by
ppp_deflate            12806  0 
zlib_deflate           26445  1 ppp_deflate
bsd_comp               12785  0 
..

2. insmod – Inserisci il modulo nel kernel

Il comando insmod inserirà un nuovo modulo nel kernel come mostrato di seguito.

# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

# lsmod | grep "squash"
squashfs               35834  0

3. modinfo – Visualizza le informazioni sul modulo

Il comando modinfo visualizzerà le informazioni su un modulo del kernel come mostrato di seguito.

# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

filename:       /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko
license:        GPL
author:         Phillip Lougher 
description:    squashfs 4.0, a compressed read-only filesystem
srcversion:     89B46A0667BD5F2494C4C72
depends:        
intree:         Y
vermagic:       3.5.0-19-generic SMP mod_unload modversions 686

4. rmmod – Rimuovi il modulo dal kernel

Il comando rmmod rimuoverà un modulo dal kernel. Non puoi rimuovere un modulo che è già utilizzato da nessun programma.

# rmmod squashfs.ko

5. modprobe – Aggiungi o rimuovi moduli dal kernel

modprobe è un comando intelligente che caricherà/scaricherà i moduli in base alla dipendenza tra i moduli. Fare riferimento ai comandi di modprobe per esempi più dettagliati.

II. Scrivi un modulo del kernel Hello World semplice

1. Installazione delle intestazioni di Linux

Devi prima installare linux-headers-.. come mostrato di seguito. A seconda della tua distribuzione, usa apt-get o yum.

# apt-get install build-essential linux-headers-$(uname -r)

2. Codice sorgente del modulo Hello World

Quindi, crea il seguente modulo hello.c nel linguaggio di programmazione C.

#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lakshmanan");
MODULE_DESCRIPTION("A Simple Hello World module");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}

static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

Avviso: Tutti i moduli del kernel funzioneranno sullo spazio del kernel, una modalità altamente privilegiata. Quindi fai attenzione a ciò che scrivi in ​​un modulo del kernel.

3. Crea Makefile per compilare il modulo del kernel

Il seguente makefile può essere utilizzato per compilare il modulo del kernel di base di Hello World sopra.

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Usa il comando make per compilare il modulo del kernel hello world come mostrato di seguito.

# make

make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic'
  CC [M]  /home/lakshmanan/a/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/lakshmanan/a/hello.mod.o
  LD [M]  /home/lakshmanan/a/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'

Quanto sopra creerà il file hello.ko, che è il nostro modulo del kernel di esempio.

4. Inserisci o rimuovi il modulo del kernel di esempio

Ora che abbiamo il nostro file hello.ko, possiamo inserire questo modulo nel kernel usando il comando insmod come mostrato di seguito.

# insmod hello.ko

# dmesg | tail -1
[ 8394.731865] Hello world!

# rmmod hello.ko

# dmesg | tail -1
[ 8707.989819] Cleaning up module.

Quando un modulo viene inserito nel kernel, verrà invocata la macro module_init, che chiamerà la funzione hello_init. Allo stesso modo, quando il modulo viene rimosso con rmmod, verrà invocata la macro module_exit, che chiamerà hello_exit. Usando il comando dmesg, possiamo vedere l'output dal modulo del kernel di esempio.

Si noti che printk è una funzione definita nel kernel e si comporta in modo simile a printf nella libreria IO. Ricorda che non puoi usare nessuna delle funzioni della libreria dal modulo del kernel.

Ora hai imparato le basi per creare il tuo modulo del kernel Linux.


Linux
  1. Linux:un kernel contaminato in Linux?

  2. Come creare thread in Linux (con un programma di esempio C)

  3. Come scrivere un file con C in Linux?

  4. Come codificare un modulo del kernel Linux?

  5. Come scrivere un demone Linux con .Net Core

Come salvare il tuo sistema Windows o Linux con Rescatux

Come creare la tua distribuzione Linux con Yocto su Ubuntu

Come scoprire la versione del kernel Linux in esecuzione sul tuo PC

Come monitorare i tuoi server Linux con Checkmk

Cron Vs Anacron:come configurare Anacron su Linux (con un esempio)

Come creare facilmente la tua distribuzione Linux?