Moduly jádra jsou části kódu, které lze na vyžádání načíst a uvolnit do jádra. Rozšiřují funkčnost jádra bez nutnosti restartu systému. Vlastní kódy lze do linuxových jader přidat dvěma způsoby. - Základním způsobem je přidat kód do zdrojového stromu jádra a překompilovat jádro.
  - Efektivnějším způsobem je přidat kód do jádra, když je spuštěno. Tento proces se nazývá načítání modulu, kde modul odkazuje na kód, který chceme přidat do jádra.
  
Vzhledem k tomu, že tyto kódy načítáme za běhu a nejsou součástí oficiálního linuxového jádra, nazývají se načítatelný modul jádra (LKM), který se liší od základního jádra. Základní jádro se nachází v adresáři /boot a je načteno vždy, když spouštíme náš počítač, zatímco LKM se načítají až po načtení základního jádra. Nicméně tyto LKM jsou z velké části součástí našeho jádra a komunikují se základním jádrem, aby dokončily své funkce. LKM mohou vykonávat různé úkoly, ale v zásadě spadají do tří hlavních kategorií - ovladač zařízení
  - ovladač souborového systému a
  - Systémová volání.
  
   Jakou výhodu tedy LKM nabízejí? Jednou z hlavních výhod, které mají, je, že nemusíme neustále obnovovat jádro pokaždé, když přidáme nové zařízení nebo když upgradujeme staré zařízení. To šetří čas a také pomáhá udržovat naše základní jádro bez chyb. Užitečné pravidlo je, že bychom neměli měnit naše základní jádro, jakmile máme funkční základní jádro. Pomáhá také při diagnostice systémových problémů. Předpokládejme například, že jsme přidali modul do základního jádra (tj. upravili jsme naše základní jádro jeho rekompilací) a modul má v sobě chybu. To způsobí chybu při spouštění systému a nikdy nebudeme vědět, která část jádra způsobuje problémy. Zatímco pokud načteme modul za běhu a způsobí to problémy, okamžitě se o problému dozvíme a můžeme modul uvolnit, dokud jej neopravíme. LKM jsou velmi flexibilní v tom smyslu, že je lze načíst a uvolnit pomocí jediného příkazového řádku. To pomáhá šetřit paměť, protože LKM načítáme pouze tehdy, když je potřebujeme. Navíc nejsou pomalejší než základní jádro, protože volání jednoho z nich jednoduše načítá kód z jiné části paměti. **Upozornění: LKM nejsou programy pro uživatelský prostor. Jsou součástí jádra. Mají volný běh systému a mohou jej snadno srazit.   So now that we have established the use loadable kernel modules we are going to write a hello world kernel module. That will print a message when we load the module and an exit message when we unload the module. Code: CPP /**  * @file hello.c  * @author Akshat Sinha  * @date 10 Sept 2016  * @version 0.1  * @brief An introductory 'Hello World!' loadable kernel  * module (LKM) that can display a message in the /var/log/kern.log  * file when the module is loaded and removed. The module can accept  * an argument when it is loaded -- the name which appears in the  * kernel log files. */ #include  /* Needed by all modules */ #include  /* Needed for KERN_INFO */ #include  /* Needed for the macros */ ///< The license type -- this affects runtime behavior MODULE_LICENSE('GPL'); ///< The author -- visible when you use modinfo MODULE_AUTHOR('Akshat Sinha'); ///< The description -- see modinfo MODULE_DESCRIPTION('A simple Hello world LKM!'); ///< The version of the module MODULE_VERSION('0.1'); static int __init hello_start(void) {  printk(KERN_INFO 'Loading hello module...n');  printk(KERN_INFO 'Hello worldn');  return 0; } static void __exit hello_end(void) {  printk(KERN_INFO 'Goodbye Mr.n'); } module_init(hello_start); module_exit(hello_end); 
   Vysvětlení výše uvedeného kódu: Moduly jádra musí mít alespoň dvě funkce: funkci 'start' (inicializaci) nazvanou init_module(), která je volána, když je modul insmodován do jádra, a funkci 'end' (cleanup) nazvanou cleanup_module(), která je volána těsně před tím, než je rmmoded. Ve skutečnosti se věci počínaje jádrem 2.3.13 změnily. Nyní můžete použít libovolný název pro počáteční a koncové funkce modulu. Ve skutečnosti je nová metoda preferovanou metodou. Mnoho lidí však stále používá init_module() a cleanup_module() pro své počáteční a koncové funkce. V tomto kódu jsme použili hello_start() jako funkci init a hello_end() jako funkci čištění. Další věc, které jste si možná všimli, je, že místo funkce printf() jsme použili printk(). Je to proto, že modul na konzoli nic nevytiskne, ale zaznamená zprávu do /var/log/kern.log. Proto se používá k ladění modulů jádra. Navíc je v hlavičce definováno osm možných řetězců loglevel, které jsou vyžadovány při použití printk(). Uvádíme je v pořadí podle klesající závažnosti: - KERN_EMERG: Používá se pro nouzové zprávy, které obvykle předcházejí havárii.
  - KERN_ALERT: Situace vyžadující okamžitou akci.
  - KERN_CRIT: Kritické stavy často související s vážnými poruchami hardwaru nebo softwaru.
  - KERN_ERR: Používá se k hlášení chybových stavů; ovladače zařízení často používají KERN_ERR k hlášení potíží s hardwarem.
  - KERN_WARNING: Upozornění na problematické situace, které samy o sobě nevytvářejí vážné problémy se systémem.
  - KERN_NOTICE: Situace, které jsou normální, ale přesto stojí za zmínku. Na této úrovni je hlášena řada podmínek souvisejících s bezpečností.
  - KERN_INFO: Informační zprávy. Mnoho ovladačů na této úrovni tiskne informace o hardwaru, který najdou při spuštění.
  - KERN_DEBUG: Používá se pro ladění zpráv.
 K vytištění zprávy jsme použili KERN_INFO. Příprava systému na spuštění kódu:   The system must be prepared to build kernel code and to do this you must have the Linux headers installed on your device. On a typical Linux desktop machine you can use your package manager to locate the correct package to install. For example under 64-bit Debian you can use: 
akshat@gfg:~$ sudo apt-get install build-essential linux-headers-$(uname -r) 
   Makefile pro kompilaci zdrojového kódu:   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 
   **Poznámka: Nezapomeňte na mezery tabulátorů v Makefile     Kompilace a načtení modulu:   Run the make command to compile the source code. Then use insmod to load the module. akshat@gfg:~$ make make -C /lib/modules/4.2.0-42-generic/build/ M=/home/akshat/Documents/hello-module modules make[1]: Entering directory `/usr/src/linux-headers-4.2.0-42-generic' CC [M] /home/akshat/Documents/hello-module/hello.o Building modules stage 2. MODPOST 1 modules CC /home/akshat/Documents/hello-module/hello.mod.o LD [M] /home/akshat/Documents/hello-module/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-4.2.0-42-generic' 
 Now we will use insmod to load the hello.ko object. akshat@gfg:~$ sudo insmod hello.ko 
   Testování modulu:   You can get information about the module using the modinfo command which will identify the description author and any module parameters that are defined: akshat@gfg:~$ modinfo hello.ko filename: /home/akshat/Documents/hello-module/hello.ko version: 0.1 description: A simple Hello world LKM author: Akshat Sinha license: GPL srcversion: 2F2B1B95DA1F08AC18B09BC depends: vermagic: 4.2.0-42-generic SMP mod_unload modversions 
 To see the message we need to read the kern.log in /var/log directory. akshat@gfg:~$ tail /var/log/kern.log ... ... Sep 10 17:43:39 akshat-gfg kernel: [26380.327886] Hello world To unload the module we run rmmod: akshat@gfg:~$ sudo rmmod hello Now run the tail command to get the exit message. akshat@gfg:~$ tail /var/log/kern.log ... Sep 10 17:43:39 akshat-gfg kernel: [26380.327886] Hello world Sep 10 17:45:42 akshat-gfg kernel: [26503.773982] Goodbye Mr.