linux-kernel
Linux Hello World Device-stuurprogramma
Zoeken…
Een lege kernelmodule
#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);
Om een Linux-apparaatstuurprogramma (Character-device, Block-device, enz ...) te schrijven, is het noodzakelijk om een kernelmodule te maken met een entry- en exit-punten.
Op zichzelf doet de kernelmodule niets; het heeft geen zinvolle manier om met de gebruikersruimte te communiceren. Met behulp van het beginpunt is het bijvoorbeeld mogelijk om een nieuw personage-apparaat te maken dat vervolgens wordt gebruikt om te communiceren met de gebruikersruimte.
De module bouwen en uitvoeren
Om het stuurprogramma te compileren, is het noodzakelijk om de Linux Kernel source tree te hebben.
Ervan uitgaande dat de bronnen at /lib/modules/<kernel-version>
, compileert de volgende Makefile het bestand driver.c
in het driver.ko
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
Merk op hoe deze Makefile-aanroepen het make
in de build-directory van de kernel.
Wanneer de compilatiestap met succes is voltooid, ziet de src-directory van het stuurprogramma er ongeveer zo uit:
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
Om de module "uit te voeren", is het noodzakelijk om in de actieve kernel in te voegen:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...