Linux eszközillesztő Bemutató Kezdőknek
A Linux operációs rendszer 3 fő részt tartalmaz: Root File System, Kernel és Bootloader.
Gyökér fájlrendszer:
Az operációs rendszer ezen része alkalmazás bináris fájlokat, könyvtárakat, szkripteket, konfigurációs fájlokat és a kernelbe tölthető modulfájlokat stb. Tartalmaz ..
Kernel:
Ez a rész az operációs rendszer lényege, a kernel felelős az operációs rendszer futtatásához szükséges összes műveletért, például a memóriakezelésért, a folyamatkezelésért és a bemeneti / kimeneti hardveres műveletekért stb
Bootloader:
Ez az első rész, amelyet a CPU indításkor végrehajt. A Bootloader tartalmazza a rendszer inicializálásához és a kernel futtatásának megkezdéséhez szükséges forráskódot, valamint parancsokat tartalmaz a kernel környezetének hibakeresésére és módosítására, valamint a kernel és a rendszerképek flash memóriába való letöltésére és frissítésére szolgáló parancsokat.
Az illesztőprogramok hídként működnek a hardver és a felhasználói alkalmazás között, a kern biztosítja a rendszerhívásnak nevezett mechanizmust, hogy beszéljen a kernellel. A Linux-ban az illesztőprogramok kétféleképpen valósíthatók meg: az egyik az illesztőprogramok a kernel részeként fordíthatók le, a másik pedig az illesztőprogramok modulokká fordíthatók és futás közben tölthetők be.
Kezdjük egy egyszerű hello world kernel modullal. Itt található az egyszerű hello world kernel modul forráskódja.
Helló.c
#include// szükséges a module_init és a modul_exit #include fájlhoz // szükséges a KERN_INFO #include-hoz // szükséges a makrókhoz int __init hw_init (void) printk (KERN_INFO "Hello World \ n"); visszatér 0; void __exit hw_exit (void) printk (KERN_INFO "Bye World \ n"); MODULE_LICENSE ("GPL"); modul_init (hw_init); module_exit (hw_exit);
Makefile
obj-m: = szia.o all: make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) modulok tiszta: make -C / lib / modules / $ (shell uname -r) / build M = $ ( PWD) tiszta
Hozzon létre egy nevű mappát Helló majd helyezze el a Helló.c és Makefile benne. Nyissa meg a terminál alkalmazást, és módosítsa a könyvtárat hello-ra. Most futtassa a parancsot készítsen és ha ez sikeres, akkor létre kell hoznia egy betölthető kernel modul fájlt Helló.ko.
Amikor futtatod a make-t, ha kimenetet kapsz make: Semmi tennivaló "mindenkiért". Ezután kérjük, győződjön meg arról, hogy a Makefile-ben megadta a fület (szóköz nélkül), mielőtt a -C parancsot elkészítené. Ha a make sikeres, akkor az alábbiak szerint kell megszereznie a kimenetet.
make [1]: A '/ usr / src / linux-header-3 könyvtár megadása.13.0-128-generic 'CC [M] / home / John / Desktop / hello / hello.o Építési modulok, 2. szakasz. MODPOST 1 modulok CC / home / John / Desktop / hello / hello.mod.o LD [M] / home / John / Desktop / mvs / pers / kern / hello / hello.ko make [1]: Kilépés a '/ usr / src / linux-header-3 könyvtárból.13.0–128-általános ”
Most teszteljük a modult úgy, hogy betöltjük a kernelbe. A kernelmodulok be- és kirakásához szuperfelhasználói engedéllyel kell rendelkeznünk. A következő paranccsal töltse be a kernelmodult a kernelbe.
sudo insmod hello.ko
A printk üzenet megtekintéséhez ellenőriznie kell a kernel naplóját, a kernel naplójának ellenőrzéséhez használja a következő parancsot.
dmesg
Ez a parancs kiadja a kernel naplóüzeneteit, a végén látnia kell, hogy az üzenetünk Helló Világ nyomtatott.
A modul kirakásához használja a következő parancsot.
sudo rmmod szia
A printk üzenet megjelenítéséhez használja újra a dmesg parancsot, és a kernel naplóban láthatja az üzenetünket Viszlát Világ.
Most értsük meg a forráskódot.
Helló.c
A rendszermag-illesztőprogram írásának megkezdéséhez használhat tetszőleges szerkesztőt vagy ide, de a rendszermag-fejlesztők általában ezt használják vi szerkesztő.
Minden kernelmodulnak tartalmaznia kell a fejlécfájlt linux / modul.h ebben vannak a deklarációk és a makrók a kernelfunkciókhoz, például module_init és module_exit stb. A rendszermag-illesztőprogram két legfontosabb funkciója a module_init és a module_exit függvény. A függvény, amelynek mutatóját a module_init-nek továbbítja, akkor fog végrehajtódni, amikor betöltjük a modult a kernelbe, és azt a függvényt, amelynek mutatóját a module_exit-nek adjuk át, meghívjuk, amikor kipakoljuk vagy eltávolítjuk a modult a kernelből.
A napló hibakereséséhez és kinyomtatásához a rendszermagban használjuk printk függvény, amely hasonló az alkalmazásban használt printf függvényhez. A naplószint megadásához használhatja a makrókat, például a KERN_INFO, a KERN_ERR stb.
Ha illesztőprogramot írunk egy bizonyos hardverrel való beszélgetéshez, akkor az init függvénynek rendelkeznie kell a hardver inicializálására szolgáló kóddal, mielőtt elkezdenénk használni, és az exit funkciónak rendelkeznie kell egy kóddal az illesztőprogramban használt erőforrások (dinamikus memória stb.) Tisztítására mielőtt kilépnénk a kernelből.
Ebben a példában itt csak debug üzeneteket nyomtatunk az init és exit funkciókba.
Makefile
A kernelmodul felépítéséhez meg kell írnunk egy Makefile fájlt, amely útmutatást nyújt készítsen segédprogram a modul fordításához. A szintaxis obj-m a kernel makefile megmondására szolgál, hogy az illesztőprogramot modulként kell lefordítani a megadott objektumfájl segítségével. Amikor csak futtatja a parancsot készítsen akkor az irányítás a minden: szakaszában, és ha futtatja a parancsot tisztává tenni akkor az irányítás a tiszta: szakasza a Makefile-ben. Ebből a Makefile-ból futtatjuk a make-et a kernel forráskönyvtárában a -C kapcsolóval. Kérjük, győződjön meg róla, hogy a rendszermag forráskönyvtára telepítve van. Ebben a példában a parancsot használtuk uname -r hogy megtalálja a rendszer linux-rendszermagjának aktuális verzióját.
Az M = $ (PWD) opcióval jeleztük a kernel makefile-ben, hogy az illesztőprogram forrása a jelenlegi munkakönyvtárban található, és megadjuk a szót modulok mondani a kernel makefile-nak, hogy csak modulokat épít, és nem a teljes kernel forráskódját. Ban ben tiszta: A Makefile szakaszban azt mondjuk a kernel makefile-nek, hogy tisztítsa meg a modul felépítéséhez létrehozott objektumfájlokat.
Ezzel meg kell kezdeni az első kernelmodul fordítását és futtatását.