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...


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow