linux-kernel
Linux Hello World Device Driver
Sök…
En tom kärnmodul
#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);
För att skriva en Linux-enhetsdrivrutin (Character-device, Block-device, etc. ...) är det nödvändigt att skapa en kärnmodul som har in- och utgångspunkter.
I sig själv gör kärnmodulen ingenting; det har inget meningsfullt sätt att kommunicera med användarområdet. Med hjälp av ingångspunkten är det möjligt att skapa en ny teckenapparat, till exempel, som sedan används för att kommunicera med användarområdet.
Bygga och köra modulen
För att kompilera drivrutinen är det nödvändigt att ha Linux Kernel-källträdet.
Förutsatt att källorna är på /lib/modules/<kernel-version>
, kommer följande Makefile att kompilera filen driver.c
till driver.ko
Kernel Object
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
Lägg märke till hur detta Makefile samtal make
i byggkatalogen av kärnan.
När kompileringssteget avslutas framgångsrikt, ser drivrutinens src-katalog något så här:
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
För att "köra" modulen är det nödvändigt att infoga i den löpande kärnan:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...