Szukaj…


Pusty moduł jądra

#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);

Aby napisać sterownik urządzenia Linux (urządzenie znakowe, urządzenie blokowe itp.), Konieczne jest utworzenie modułu jądra, który ma punkty wejścia i wyjścia.

Sam moduł jądra nic nie robi; nie ma żadnego sensownego sposobu komunikowania się z przestrzenią użytkownika. Za pomocą punktu wejścia można na przykład utworzyć nowe urządzenie znakowe, które będzie następnie używane do komunikacji z przestrzenią użytkownika.

Budowanie i uruchamianie modułu

Aby skompilować sterownik, konieczne jest posiadanie drzewa źródeł jądra Linux.

Zakładając, że źródła znajdują się w /lib/modules/<kernel-version> , następujący Makefile skompiluje plik driver.c w 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

Wskazówki, jak to wymaga Makefile make w katalogu kompilacji jądra.

Po pomyślnym zakończeniu kroku kompilacji katalog src sterownika będzie wyglądał mniej więcej tak:

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

Aby „uruchomić” moduł, należy wstawić do działającego jądra:

$ 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow