Tvorba modulů 0x2 - Hello World

Verze pro tiskPDF verze

...navazuje na poslední článek věnovaný programování kernel modulům, tentokráte od jiného autora...

----------------------[ 0x1 Makefile

Začnu trošku odjinud, pokud neumíme modul zkompilovat, tak není důvod proč ho programovat.
Pro víc info jak se píše Makefile se zeptejte strýčka google.
důležité pro nás je jméno modulu (potažmo zdrojáku), v tomto případě je to "hello.c" takže do Makefile píšeme "hello.o", kdo nechápe, tak ať použije google.

obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

a výsledek?

wwwnick@sapimaa:~/projects/playground/lkm/hello_world$ make
make -C /lib/modules/2.6.20.6sapimaa/build M=/home/wwwnick/projects/playground/lkm/hello_world modules
make[1]: Entering directory `/usr/src/linux-2.6.20.6'
  CC [M]  /home/wwwnick/projects/playground/lkm/hello_world/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/wwwnick/projects/playground/lkm/hello_world/hello.mod.o
  LD [M]  /home/wwwnick/projects/playground/lkm/hello_world/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.20.6'
wwwnick@sapimaa:~/projects/playground/lkm/hello_world$

----------------------[ 0x2 Hello world!

Tak jdeme na to děcka, tady mate zdroják.

/*
* hello.1.c . The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#define DRIVER_AUTHOR "Wwwnick";
#define DRIVER_DESC "Hello world modul pro decka\nKtery vypisuje text";
MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);


int init_module(void)
{
        printk(KERN_INFO "Hello world\n");
return 0;
}

void cleanup_module(void)
{
        printk(KERN_INFO "Goodbye suckers\n");
}

inux/module.h - toto je potřeba pro každý modul.
linux/kernel.h - toto nám definuje makro KERN_INFO

funkce init_module a cleanup_module jsou automaticky volány při nahrání/odstranění modulu z paměti. Toto už je nedoporučované, ale je to o dva řádky kódu méně :)
Toto se dá řešit i jinak, později si ukážeme jak.

tak zkombajníme si modul a jdeme dál...

----------------------[ 0x3 Stary dobry In - Out

tak teďka si hezky vezmeme man insmod(1) a koukneme se jak se loadujou moduly, máme? tak si loadněte modul...
typicky příkaz:

wwwnick@sapimaa:~/projects/bee$ insmod ~/projects/playground/lkm/hello_world/hello.ko

No a nic se nám nevypsalo, tak šup zkontrolovat dmesg a tam bude něco takovéto

[7340294.416590] hello: module license 'unspecified' taints kernel.
[7340294.417323] Hello world

Ooops, kernelu se to nějak nelíbí, zapomněli jsme si kód licencovat, napravíme to tak že pod include si přidáme
MODULE_LICENSE("GPL");
pro ůplný seznam licencí si projděte linux/module.h
nejzajímavější pro nás, snad nepotřebuje vysvětlení:

--- "GPL"
--- "GPL v2"
--- "Dual BSD/GPL"
--- "Proprietary"

Další zajímavá věci jsou autor a popis modulu

MODULE_AUTHOR(DRIVER_AUTHOR);    
MODULE_DESCRIPTION(DRIVER_DESC);

a pak si někde na začátek kódu vrazíme

#define DRIVER_AUTHOR "Wwwnick";
#define DRIVER_DESC "Hello world modul pro decka\nKtery vypisuje text";

a pak tam můžeme vidět toto když si dáme modinfo na zkombajnovaný modul.

wwwnick@sapimaa:~/projects/playground/lkm/hello_world$ /sbin/modinfo ./hello.ko
filename:       ./hello.ko
description:    Hello world modul pro decka
Ktery vypisuje text
author:         Wwwnick
license:        GPL
depends:
vermagic:       2.6.20.6sapimaa SMP mod_unload PENTIUMII

tak a ještě si modul unloadneme, ať nám tam nezabírá místo.

wwwnick@sapimaa:~/projects/bee$ rmmod ~/projects/playground/lkm/hello_world/hello.ko

a opět zkontrolujeme dmesg

[7340511.767102] Goodbye suckers

----------------------[ 0x4 Disclaimer

provozováno pod 2.6.x kernelem, 2.4.x kernel má jiný build systém na moduly. Toto je velmi lehký uvód, pokud máte nějaké speciální požadavky, tak šup do komentářů

----------------------[ 0x5 Author

Autorem je Wwwnick, za motivaci napsat tento článek děkuji absolutní sobotní odpolední nudě a flašce piva.