GNU/Linux >> Znalost Linux >  >> Linux

Jak napsat svůj vlastní modul linuxového jádra s jednoduchým příkladem

Co jsou moduly jádra?

Moduly jádra jsou části kódu, které lze na vyžádání načíst a uvolnit z jádra.

Moduly jádra nabízejí snadný způsob, jak rozšířit funkčnost základního jádra, aniž byste museli jádro znovu sestavovat nebo znovu kompilovat. Většina ovladačů je implementována jako moduly linuxového jádra. Když tyto ovladače nejsou potřeba, můžeme uvolnit pouze tento konkrétní ovladač, čímž se zmenší velikost obrazu jádra.

Moduly jádra budou mít příponu .ko. Na normálním linuxovém systému budou moduly jádra umístěny v adresáři /lib/modules//kernel/.

Dříve jsme diskutovali o tom, jak zkompilovat jádro ze zdrojového kódu.

Tento tutoriál vysvětluje, jak napsat modul jádra pomocí jednoduchého příkladu Hello World.

I. Nástroje pro manipulaci s moduly jádra

1. lsmod – Seznam modulů, které již byly načteny

Příkaz lsmod zobrazí seznam modulů, které jsou již nahrány v jádře, jak je ukázáno níže.

# lsmod
Module                  Size  Used by
ppp_deflate            12806  0 
zlib_deflate           26445  1 ppp_deflate
bsd_comp               12785  0 
..

2. insmod – Vložit modul do jádra

Příkaz insmod vloží do jádra nový modul, jak je znázorněno níže.

# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

# lsmod | grep "squash"
squashfs               35834  0

3. modinfo – Zobrazení informací o modulu

příkaz modinfo zobrazí informace o modulu jádra, jak je uvedeno níže.

# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

filename:       /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko
license:        GPL
author:         Phillip Lougher 
description:    squashfs 4.0, a compressed read-only filesystem
srcversion:     89B46A0667BD5F2494C4C72
depends:        
intree:         Y
vermagic:       3.5.0-19-generic SMP mod_unload modversions 686

4. rmmod – Odebrat modul z jádra

Příkaz rmmod odstraní modul z jádra. Nemůžete odebrat modul, který je již používán jakýmkoli programem.

# rmmod squashfs.ko

5. modprobe – Přidat nebo odebrat moduly z jádra

modprobe je inteligentní příkaz, který načte/uvolní moduly na základě závislosti mezi moduly. Podrobnější příklady naleznete v příkazech modprobe.

II. Napište jednoduchý modul jádra Hello World

1. Instalace linuxových hlaviček

Nejprve musíte nainstalovat linux-headers-.. jak je ukázáno níže. V závislosti na vaší distribuci použijte apt-get nebo yum.

# apt-get install build-essential linux-headers-$(uname -r)

2. Zdrojový kód modulu Hello World

Dále vytvořte následující modul hello.c v programovacím jazyce C.

#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lakshmanan");
MODULE_DESCRIPTION("A Simple Hello World module");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}

static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

Upozornění: Všechny moduly jádra budou pracovat v prostoru jádra, což je vysoce privilegovaný režim. Buďte tedy opatrní s tím, co píšete do modulu jádra.

3. Vytvořte Makefile pro kompilaci modulu jádra

Následující makefile lze použít ke kompilaci výše uvedeného základního modulu jádra hello world.

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

Pomocí příkazu make zkompilujte modul jádra hello world, jak je ukázáno níže.

# make

make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic'
  CC [M]  /home/lakshmanan/a/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/lakshmanan/a/hello.mod.o
  LD [M]  /home/lakshmanan/a/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'

Výše uvedené vytvoří soubor hello.ko, což je náš ukázkový modul jádra.

4. Vložte nebo odeberte ukázkový modul jádra

Nyní, když máme náš soubor hello.ko, můžeme tento modul vložit do jádra pomocí příkazu insmod, jak je ukázáno níže.

# insmod hello.ko

# dmesg | tail -1
[ 8394.731865] Hello world!

# rmmod hello.ko

# dmesg | tail -1
[ 8707.989819] Cleaning up module.

Po vložení modulu do jádra bude vyvoláno makro module_init, které zavolá funkci hello_init. Podobně, když je modul odstraněn pomocí rmmod, bude vyvoláno makro module_exit, které zavolá hello_exit. Pomocí příkazu dmesg můžeme vidět výstup z ukázkového modulu jádra.

Pamatujte, že printk je funkce, která je definována v jádře a chová se podobně jako printf v knihovně IO. Pamatujte, že nemůžete použít žádnou z funkcí knihovny z modulu jádra.

Nyní jste se naučili základy vytváření vlastního modulu Linux Kernel.


Linux
  1. Jak používat příkaz Rmmod v systému Linux s příklady

  2. Linux – poskvrněné jádro v Linuxu?

  3. Jak kódovat modul jádra Linuxu?

  1. Linux – Jak zjistit, který modul poškozuje jádro?

  2. Linux – Jak správně znovu načíst modul jádra?

  3. Jak vytvářet vlákna v Linuxu (pomocí ukázkového programu C)

  1. Jak napsat soubor s C v Linuxu?

  2. Jak sestavit modul jádra Linuxu tak, aby byl kompatibilní se všemi verzemi jádra?

  3. Jak napsat linuxového démona s .Net Core