Ricerca…


Un modulo del kernel vuoto

#include <linux/init.h>
#include <linux/module.h>

/**
 * This function is called when the module is first loaded.
 */    
static int __init hello_kernel_init(void)
{
    printk("Hello, World!\n");
    return 0;
}

/**
 * This function is called when is called if and when the module is unloaded.
 */
static void __exit hello_kernel_exit(void)
{
    printk("Goodbye, cruel world...\n");
}

/* The names of the init/exit functions are arbitrary, and they are bound using the following macro definitions */
module_init(hello_kernel_init);
module_exit(hello_kernel_exit);

Per scrivere un driver di dispositivo Linux (Character-device, Block-device, ecc ...), è necessario creare un modulo del kernel che abbia un punto di ingresso e di uscita.

Di per sé, il modulo del kernel non fa nulla; non ha un modo significativo per comunicare con lo spazio utente. Utilizzando il punto di ingresso è possibile creare un nuovo dispositivo di carattere, ad esempio, che viene quindi utilizzato per comunicare con lo spazio utente.

Costruire e far funzionare il modulo

Per compilare il driver, è necessario avere l'albero dei sorgenti del kernel Linux.

Supponendo che le fonti siano in /lib/modules/<kernel-version> , il seguente Makefile compilerà il file driver.c driver.ko kernel driver.ko

obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)

all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

Si noti come queste chiamate Makefile si make nella directory build del Kernel.

Quando la fase di compilazione termina correttamente, la directory src del driver sarà simile a questa:

driver.c  driver.ko  driver.mod.c  driver.mod.o  driver.o  Makefile  modules.order  Module.symvers

Per "eseguire" il modulo, è necessario inserirlo nel kernel in esecuzione:

$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!

$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow