A kernel és a modulok összeállítása. A Linux kernel konfigurációja és a fordítás teljes kapcsoló tesztje

Zharoznizhyuchі zasobi gyermekek számára elismert gyermekorvos. Állítólag vannak olyan helyzetek, amikor láz esetén feltűnő segítségre van szükség, ha a gyermek ártatlanul szorul rá. A todi apák átvállalják a lázcsillapító gyógyszerek sokoldalúságát és konzisztenciáját. Szabad-e mellet adni a gyerekeknek? Hogyan lehet legyőzni a nagyobb gyerekek hőmérsékletét? Melyek a legjobbak?

Ha egy unalmas és megbízható Linux alapú rendszer telepítésére van szükség (akár az technológiai folyamatok, Webtárhely stb.), akkor sokszor ilyen rangban kell a rendszermagot beállítani, hogy az egész rendszer hatékonyabban és hatékonyabban működjön. A Linux kernel univerzális akar lenni, megvédi a helyzeteket, ha érthető okokból "hangolni" kell. Ez a saját teljesítménye átvitelének magvának architektúrája. Ilyen rangban a Linux rendszergazdák olyan emberek, akik fontosak a Linux kernel konfigurációjának fő szempontjainak nemessége és intelligencia szempontjából.

Linux kernel konfigurációs módszerek

A Linux fejlesztése egy órája folyamatosan összeállított néhány fő módszert a kernel konfigurálására:

  • paraméterek módosítása a kernel hangolásához;
  • kernel kiválasztása kimeneti kódokból a kernel kimeneti kódjainak szövegéhez szükséges változtatásokkal és/vagy kiegészítésekkel;
  • új komponensek (funkcionális modulok, illesztőprogramok) dinamikus csatlakoztatása az új kernelhez;
  • a speciális utasítások átadása a kernelnek egy órányi csonkoláshoz és/vagy vikoristovuchi zavantazhuvachhoz (például GRUB).

A konkrét helyzettől függetlenül a győztes út sikere. De az első alkalommal szükséges tudni, de a legjobb az egészben az első a kernel paramétereinek konfigurálása. Ugyanaz a hajtogatás є a kernel összeállítása a kimeneti kódokból.

Kernel paraméterei

A Linux rendszermag ilyen rangban tört fel, így lehetővé vált a lehető legrosszabb (ráadásul, mint a UNIX és Linux rendszerekben minden) felállítása, a kizsákmányolás és a hardverfinomítás szükséges elméjéhez igazítva. . Így az egész folyamat nagyon dinamikus volt a kész kernelnél. Vagyis a rendszergazdák az óra bármely pillanatában bevezethetnek korrekciós paramétereket, befecskendezve a robotba magát a magot, valamint a harmadik komponenseket.

A Coristuvalnytsky Rivnya magjának és programjainak fejlesztéséhez speciális felület, információs csatornák állnak rendelkezésre. Az utasítások a kernelparaméterek értékeit beállító csatornákon keresztül kerülnek elküldésre.

Ale jak, UNIX és Linux rendszerekben minden, a kernelparaméterek konfigurálása információs csatornákon keresztül fájlrendszer... A kernel konfigurációjának és a benne lévő keruvat újbóli megtekintéséhez a / proc / sys könyvtár fájlrendszerében nézze meg a speciális fájlokat. Tse zvychaynі fájlokat, ale bűzt játszani a középső szerepét, hogy interfészt biztosít a dinamikus interakcióhoz a maggal. A nagyon fontos dokumentáció azonban konkrét paraméterek leírásáról és jelentésükről szól a minimum elérése érdekében. Az egyik dzherel, ahonnan a központiak akcióit szedhetjük össze, a Documentation / sysent könyvtár a katalógusban a kernel kimeneti kódjaival.

A pontosság kedvéért nézzünk meg egy kis feneket, amely megmutatja a kernelparaméteren keresztül, állítsa be a maximális mennyiséget egy óra alatt fájlok megtekintése a rendszerben:

$ Cat / рroc / sys / fs / file-max 34916 $ sudo sh -c "echo 32768> / proc / sys / fs / file-max"

Jak lehet bachiti, ilyen szintig gyors hangot lehet kapni és nem fogsz menni még összehajthatóbban. Ez a módszer nagyon praktikus, és nem okoz gondot a rendszer újraindítása.

Választhat egy speciális segédprogramot is sysctl... A változtatások értékeit közvetlenül a parancssorból szerkesztheti, a változás = érték párok listájához a fájlból. A segédprogram cobbing szakaszában olvassa el a fájlban megadott paraméterek cob értékeit /etc/sysctl.conf... Részletes információ a segédprogramról sysctl oldalán találhatók.

Az offenzív asztaloknál a kernel paraméterei fel vannak hangolva:

Katalógus Fájl / paraméter értékelés
Z autoeject A CD-tálca automatikus kinyitása a CD-ROM-melléklet leválasztásakor
F fájl-max a megnyitott fájlok maximális száma. A nagyszámú fájllal feldolgozható rendszereknél az érték 16384-ig módosítható
F inode-max A nyílt kritikus indexleírók maximális száma egy folyamatban. Olyan dokumentumokhoz jó, amelyek több tízezer fájlleírót jelenítenek meg
Előtt
Előtt printk ratelimit Minimális időköz a kernelek között, másodpercben
Előtt printk_ratelimi_burst Van néhány alkalom, mert vétkesek az elutasításban, mielőtt a minimális intervallum kisebb, mint a printk aktiválása
Előtt shmmax Az élő memória maximális mérete
N conf / default / rp_filter Tartalmazza a kimeneti fájlhoz vezető útvonal átirányításának mechanizmusát
N icmp_echo_ A cél ICMP-hírcsatornáinak figyelmen kívül hagyása 1
N icmp_echo_ A nagy területű ICMP tápegységek figyelmen kívül hagyása, különösen az ajtóknál 1.
N ip_forward IP-csomagok továbbítása, amelyeket az 1-es útra szánnak. Például, ha a Linux-on futó gép routerként fut, akkor az árat 1-re kell beállítani.
N ip_local_port_ Egy sor helyi port, amely egy nap konfigurálásakor látható. A szerverek termelékenységének növelése érdekében, hogy sok különböző szerver legyen, a paramétert 1024-65000-ig kell bővíteni.
N tcp_fin_timeout A végső RN-csomag ellenőrzésének időköze (másodpercben). A kiszolgálók termelékenységének növelése érdekében, mivel nagy forgalmat engednek át, sok alacsony értéket kell beállítani (közel 20)
N tcp_syncookies SYN-bővítmények elleni támadások észlelése. DOS támadás esetén engedélyezni kell

Meghatározási értékek: F - / proc / sys / fs, N - / proc / sys / net / ipv4, К - / proc / sys / kernel, С - / proc / sys / dev / cdrom.

$ Sudo sysctl net.ipv4.ip_forward = 0

A parancssor hatására az IP-csomagok továbbítása engedélyezve lesz. Є A parancs szintaxisának egyik különlegessége: pont szimbólumok a "net.ipv4.ip_forward"-ban, a szimbólumokat cserélje ki perjelre az ip_forward fájl elérési útjában.

Ha szüksége van a kernel új verziójára?

Napjainkban a Linux kernel gyorsan és lendületesen fejlődik. A terjesztési készletek leggyakrabban nem tartalmazzák a rendszermagok új verzióit. Általános szabály, hogy minden újdonsült "hal" jobban ismerős az egzotikumok rajongóinak, az entuziáknak, az új kiegészítések és létesítmények tulajdonosainak, és egyszerűen addiktív - vagyis.

A szervergépeknél a prote, a divat valószínűleg nem lesz jelentős, de az új technológiákat megbízhatóságuk és hatékonyságuk gyakorlatba ültetésére csak tesztpadon vagy platformon lehet alkalmazni. A tájékozottságra törekvő rendszergazda tudja, hogy egyszer újra és újra túlhajszolt, ha lehetséges, jó és hibamentes, nem elég a rendszer félreérthetetlen modernizálása. Még több robotra van szükség hosszú évekre (a kimeneti kódokból is ki kell szedni a magot, könnyű befejezni) és szervizelni, elérni a forgalmas utat, oskolkot, redundancia nélkül szállítani a teljes szerverre. ( és még inkább a "hideg") tartalék nélkül.

Ehhez feltétlenül ismerje meg az összes tisztviselőt, és mérje fel, kik érdeklődnek a patchjeik állapota iránt, mert nem töltenek rendszereket a robotba, de még csak új meghajtókat sem a mellékletekhez, ami Dániában a rendszerben jelenleg nem megy. hamarosan átviszik.

Ha a kernel új verziójának döntését ennek az önálló csoportnak a dzsentrije hozta meg, akkor szükséges, hogy a verzió stabil legyen. Korábban a Linux kernel verziószámozási rendszere ilyen rangsorban szerveződött, ahol a páros verziószámok stabil kiadást jelentettek, páratlan - inkább "Szíriát". Dániában az az elv, hogy ne csak várjuk meg a pillanatot, amikor a kernel.org hivatalos weboldalon található információkból iszik.

Kernel paraméterek konfigurálása

A Linux kernel konfigurációja a .config fájlba menthető. Először is nem elég egy fájl, skinek kézi kezelésével és szerkesztésével foglalkozni: egy bonyolult szintaxissal, amely távolról sem „ember által olvasható”, hanem más módon: vannak módok a fájlok automatikus generálására. kernel grafikus konfigurációk. lista fő csapatok a kernelgyűjtemény beállításához:

  • make xconfig – A KDE grafikus köztes szoftverének használata javasolt. Velmi Zruchniy hangszer;
  • make gconfig - egy rövid verzió a viktoriánus számára a GNOME grafikus környezetében;
  • make menuconfig - a segédprogram diákjainak adott vikoristovuvati pszeudografikus módban. Vona nem olyan okos, mint ketten elöl, de a funkcióival jó ezt csinálni;
  • make config - a legjobb nem manuális "konzol" opció, amely a kernel skin paraméter értékére állítható. Ne engedje meg a már beállított paraméterek megváltoztatását.

Gyakorlatilag az összes opció (a többi hibáztatásával) lehetővé teszi a skin paraméter rövid kiegészítését, a szükséges paraméter (vagy egy konfigurálható disztribúció) lekérését, további összetevők hozzáadását a konfigurációhoz, a meghajtást és a megjelenítést. specifikusan a kernelbe, akár a modul zárolásakor, akár a modul hozzáadásra kerül a fordítási opcióhoz, amikor a modul zárolva van.

A make oldconfig parancs még bíbor színben jelenhet meg, a jelenlegi konfiguráció átvitelére szolgál a kernel új verziójáról (zbirki) az új buildbe. A parancs beolvassa a konfigurációt az átvitt fájlból a .config fájlból a régi verzióval, az űrlappal, mivel az aktuális letöltéshez új paraméterek állnak rendelkezésre, és ha engedélyezni, vagy felülírni akarjuk.

A Linux kernel konfigurációjának megjelenítéséhez lépjen a kiadási kódokat tartalmazó könyvtárba, és futtassa az egyik parancsot a konfiguráció létrehozásához.

A robotparancsok hatására egy .conf fájl jön létre, egy töredék ahelyett, amit meg tudunk lépni:

# # Automatikusan generált fájl; NE SZERKESZTÉSE. # Linux / x86 4.20.7 Kernelkonfiguráció # # # fordító: gcc (Ubuntu 7.3.0-27ubuntu1 ~ 18,04) 7.3.0 # CONFIG_CC_IS_GCC = y CONFIG_GCC_VERSION = 70300 CONFIG_CLANG_VERSION = 0 CONFIG_IRQ_WORK = y CONFIG_BUILT CONFORTIME beállítás # CONFIG_INIT_ENV_ARG_LIMIT = 32 # CONFIG_COMPILE_TEST nincs megadva CONFIG_LOCALVERSION = "" # CONFIG_LOCALVERSION_AUTO nincs megadva CONFIG_BUILD_SALT = "" CONFIG_HAVE_KERNEL_GZIP = y CONFIG_HAVE_KERNEL_BZIP2 = y CONFIG_HAVE_KERNEL_LZMA = y CONFIG_HAVE_KERNEL_XZ = y CONFIG_HAVE_KERNEL_LZO = y CONFIG_HAVE_KERNEL_LZ4 = y CONFIG_KERNEL_GZIP = y # CONFIG_KERNEL_BZIP2 nem készlet # CONFIG_KERNEL_LZMA nincs megadva # CONFIG_KERNEL_XZ jelentése nem készlet # CONFIG_KERNEL_LZO nem készlet # CONFIG_KERNEL_LZ4 nincs beállítva CONFIG_DEFAULT_HOSTNAME = "(nincs)" CONFIG_SWAP = y CONFIG_SYSVIPC = y CONFIG_SYSVIPC_SYSCTL = y CONFIG_POSIX_MQUEUE = y CONFIG_POSIX_MQUEUE_SYSCTL = y CONFIG_CROSS_MEMORY_ATTACH = y CONFIG_USELIB = y

A jak lehet bachiti, ebben a kódban nincs trükk a kézi szerkesztéshez, csak navigáljunk a .config fájl csutkáján található kommentárban. Az "y" szimbólum az elején, függetlenül attól, hogy a sorban van, hozzáadódik a törzsraktárhoz, az "m" a modul. A dekódolásokat vagy leírom a skin komponensről, vagy a.config fájl paramétereit nem fogják bosszút állni - a tápról van utána a dokumentációnak.

kernel összeállítás

A Linux kernel összeállításában sok van - a zbirka konfigurációjának fő része, néhányra a nemességnek szüksége van, mint a kulcs összetevőire. Szeretném ellenőrizni a make xconfig, make gconfig, make menuconfig parancsokat és az alapértelmezett működő konfiguráció nélkül, hogy melyik rendszer fog működni nagyszámú hardverplatformon és konfiguráción. A táplálkozás csak abban rejlik, hogy megfelelően telepíti a kernelkonfigurációt, szükségtelenül, és munka közben erőforrásokat kölcsönöz az összetevőkből.

Ezenkívül a kernel sikeres konfigurálásához és fordításához a következő eseményekre van szükség:

  • lépjen a kernel kimeneti kódjaival rendelkező könyvtárba. Adja meg a "wins" parancsot, hogy a Linux kernel a / usr / src könyvtárba kerüljön, vagy linkelheti a kernel.org webhelyről bármely kézre;
  • viconati parancs make xconfig, make gconfig vagy make menuconfig;
  • viconate a make dep parancsot (lehet, hogy nem érvényes a 2.6.x és újabb verziójú kernelekhez);
  • viconati a make clean parancs (minden felülírható törléséhez);
  • Viconati parancsot ad;
  • viconati make modules_install parancs;
  • másolja az / arch / arch_name / boot / bzImage fájlt a / boot / vmlinuz mappába. Itt az / arch könyvtár található a katalógusban a Linux kernel kimeneti kódjaival, a név_architektúra pedig a könyvtár, amely az aktuális architektúra neve (a konfiguráció szakaszában van kijelölve). A bzImage kernel kiválasztott bináris képe használható;
  • másolja a /arch/name_arch_tectury/boot/System.map fájlt a /boot/System.map mappába;
  • módosítsa az áthidalandó konfigurációs fájlokat /etc/lilo.conf (LILO esetén) vagy /boot/grub/grub.conf - GRUB esetén, valamint adjon hozzá további konfigurációkat és beállításokat az új kernelhez.

Yaksho vi ismerte a kegyelmet, légy menyét, lásd a szöveg egy töredékét és natisnit Ctrl + Enter.

A moduláris program különlegességei otthoni ajánlások s indukálják a moduláris felépítés programját.

A modulok bekötése a főprogramokhoz a USES lefokozási sorrendjében történik, ugyanebben a sorrendben a modulok integrációjának blokkjai, amelyek a programok megjelenítése előtt kapcsolhatók a főprogramokhoz.

A modulok megjelenítési sorrendje hozzáadható a könyvtári adatok és szoftverek eléréséhez.

Például, ha az M1, M2 nevű modulok ugyanarra az A típusra, B változásra és C programra illeszkednek, akkor ha a USES modellek a teljes PE-ben A-hoz, B-hez, C-hez kapcsolódnak, akkor egyenértékűek lesznek a modulokkal. 2-ig.

Ha a bitek helyességét akarjuk jellemezni az azonos kiegészítő beépülő modulok egységeihez szükséges bitekhez, akkor érdemes egy modult hozzáadni a modulhoz, és az objektum pontján keresztül: МСА М1В М1.

Nyilvánvaló, hogy könnyű befejezni. remek program két részen (PE), tehát a főprogram + modulok.

Bőrformáló PE a memória szegmensében és a sajátjában lemez fájl.

A PE-hez (a fő program és a lehetséges modulok) az összes csupasz típus, valamint a hibásan elérhető halk is elérhető a prémium modulhoz egy üres vikonuált résszel. Ugyanakkor nem követem a vadállatokat, tisztelem azokat, akik nem szeretik a PE-t (például egy modult), nem gonoszak az összes tsikh meztelenül. Egy ilyen modul belső részében szerepelhet egy operátor, amely összekapcsolja a nem szabványos fájlokat. szöveges fájlok(ASSIGN) і і і і і і і і і і fájlok, hogy a tribute átvitele előtt (RESET і REWRITE) tudjuk használni a játékot.

A programok első csoportja, például egy sor kompakt függvény, 3 (a szerint) modulban van elhelyezve;

Amikor a szoftvert modulok szerint osztják szét egy hajtogatási projektben, a hiba különös tiszteletben tartása szerepel az ütemezésben és az írás pillanatában.

A TR є koshty közepén többféleképpen is összeállíthatja a modulokat.

Fordítsa le az Alt + F9 RUN Cntr + F9

Úticél memória

A módok csak a kommunikáció módjában és a fő programban vannak kifejlesztve.

Fordítási mód

Lefordítva a fő program vagy egy modul, amely pillanatnyilag a szerkesztő aktív ablakában található. Amint változás történik a koristuvach nem szabványos moduljaira, akkor a mód látható a ___ kiterjesztésű lemezfájlok hátuljáról. Tpu egy ilyen skin beépülőhöz.



Ha a Célt a memóriába menti, akkor a fájlok csak a memóriában vesznek el, és a lemezfájl nem törlődik.

A tpu-fájlokat azonban egyszerűbb az összes program fordítójával együtt fordítani a további módokhoz, mivel nem kell a Disk-t beállítani a cél opcióként.

Készítés mód

A teljes módban történő fordításkor a skin modul előtt (a fő programok fordítása előtt) a következőket kell módosítani:

1) Lemez tpu fájl eltávolítása; ha buta, akkor automatikusan átvillan a modul kimeneti szövegének fordításán, így az pas-fájl

2) A tpu-fájl által ismert modul egyeztetése, ahol a változtatásokat végrehajthatták volna; a tpu fájl automatikusan újra bezárul a legördülő listában

3) A modul interfész szakaszának képtelensége: ha változás történik, akkor ezek a modulok is újrafordításra kerülnek (ezek benne vannak a pas-fájlokkal), ebben az esetben a modul a USES javaslatban van feltüntetve.

Ha nem történt változás a modulok cob szövegeiben, akkor a robot fordítója összekapcsolódik a tpu -File-lel és a fordítás győztes órájával.

Építési mód

A Make mód nézetében automatikusan megjelenik a kimeneti pas-fájlok láthatósága; a skin modul összeállításának (újrafordításának) elvégzése és a pas-file szövegek minden változásának garanciája. Ez egy extra óra a programok egészének összeállítására.

A kijelzőn fordítási módban a Make and Build mód lehetővé teszi a moduláris felépítés lefordított programjának kijavítását tetszőleges pas-fájlból (amit az elsőnek nevezünk), akárcsak a fájlt (vagy a programok egy részét). ) az aktív szerkesztőben van. Az egészhez a fordítási pontban válasszuk az Elsődleges fájl opciót, nyomjuk meg az Entert és írjuk le az eredeti pas-fájlt, és a fordítást maga a fájl fogja megjegyezni.

Ha az eredeti fájl nem így jelenik meg, akkor a fordítás Make, Build és RUN módban is csak úgy történhet, ahogy a fő program a szerkesztő aktív ablakában van.

Névjegy: "Az újrafordítás indítékai miatt" Linux Device Driver 2. kiadás. Átigazolás: Olekszij herceg [E-mail védett] dátum az utolsó kígyó: 2004.08.03. Terjesztés: http://lug.kmv.ru/index.php?page=knz_ldd2

Most javítsuk ki a programot! Ezzel egyidejűleg a modulokra és a kernelben lévő szoftverekre vonatkozó főbb rendelkezéseket is ismertetjük.
Itt kiválasztunk és elindítunk egy új modult, aminek a felépítése úgy néz ki, mint egy igazi moduláris meghajtó.
Ugyanakkor a fejhelyzetekre koncentrálunk, nem a valódi kötődések sajátosságaira.

A kernel minden része, mint például a függvények, változtatások, fejlécek és makrók, mint itt találgatás,
a könyvben részletesen le van írva.

Helló Világ!

Az Alessndro Rubini és Jonathan Corbet által írt eredeti anyag megismerésének folyamatában nincs túl messze a fenék, a cél pedig a Hello world! Ehhez szeretném elolvasni, az én pillantásomra ott van az első modul nagyobb verziója. Bátorítok, hogy a 2.4.x verziók kernelének telepítésével nincs probléma. A terjedési modul és fordítási módja lehetővé teszi a vikoristovuvati-t a kernelekben, mivel érzékeny a verziókezelésre, és nem fogadja el a verziókezelést. Olvasson többet, és tudjon meg többet a részletekről és a terminológiáról, azonnal kinyitom a vimet és javítom!

=================================================== // hello_knz.c fájl #include #beleértve <1>Hello, world \ n "); return 0;); void cleanup_module (void) (printk ("<1>Viszlát kegyetlen világ \ n ");) MODUL_LICENC (" GPL "); ================================ == ================

Egy ilyen modul lefordításához dönthet úgy, hogy készít egy Makefile-t. Ne felejtsen el egy tabulátor karaktert tenni a sor elé, hogy javítsa a $ (CC) ....

=================================================== FLAGS = -c -Wall -D__KERNEL__ -DMODULE PARAM = -I / lib / modules / $ (shell uname -r) / build / include hello_knz.o: hello_knz.c $ (CC) $ (FLAGS) $ (PARAM) - o [E-mail védett] $^ =================================================

Két különlegesség van itt, az eredeti Hello világ kódexének megfelelően, amelyet Rubini & Corbet javasolt. Először is, a modul egy anyaverzió lesz, és a kernel verzióból épül fel. Ez eléri a változó PARAM értékeit a fordítás forgatókönyvében. Alternatív megoldásként most a modul a GPL-ben lesz licencelve (a MODULE_LICENSE () makróra érvényesítve). Ha nem tudod megölni, akkor a kernelbe telepítve a modult le tudod verni, durván kezd rosszabbodni:

# Insmod hello_knz.o Figyelmeztetés: a hello_knz.o betöltése beszennyezi a kernelt: nincs licenc. A szennyezett modulokról a http://www.tux.org/lkml/#export-tainted oldalon olvashat. A hello_knz modul betöltött, figyelmeztetésekkel

Most megmagyarázhatóak a modul-összeállítási lehetőségek (a makróértékeket alább ismertetjük):

-s- ha ez az opció elérhető, a gcc fordító azonnal leállítja a fájl fordítási folyamatát, miután elküldte a fájlt a fájlba, ne habozzon megpróbálni megnyitni a binárisokat.

-Fal- a gcc robot működésének maximális értéke.

-D- a makrók értéke. Ezek a #define direktívák a lefordított fájlokban. Abszolút nincs különbség, semmilyen módon nem lehet kezdeni, mint vikoristoyutsya ebben a modulban, makrók, a további #define a forrásfájlban, vagy a kiegészítő -D opció a fordító számára.

-ÉN- Kiegészítők a viccek include-fájlokhoz. Szörnyű tisztelet az "uname -r" viktoriánus beállítással szemben, amely a dán pillanatban a kernel viktoriánus változatának fogja nevezni.

A támadó razdіlі hozta a іnshy popsi a modul. Ugyanitt a jelentés elmagyarázza a telepítés módját és a kernelből való élénkítést.

Eredeti Hello world!

Most a Rubini & Corbet által népszerűsített egyszerű "Hello, World" modul eredeti kódja elérhető. A teljes kód lefordítható a 2.0-tól 2.4-ig terjedő rendszermagokhoz. Az egész fenék, mint mindegyik, bemutatásra kerül a könyvben, amely elérhető az O'Reilly FTP webhelyen (1. fejezet).

// hello.c fájl #define MODULE #include int init_module (void) (printk ("<1>Hello, world \ n "); return 0;) void cleanup_module (void) (printk ("<1>Viszlát kegyetlen világ \ n ");)

funkció printk () Linux kernelekben tervezve és gyakorlati szempontok, mint standard bibliai funkciók printf () filmben Сі. A kernelnek saját erőre van szüksége, de nem nagy méretű, a vivedennya funkciója az, hogy a közepe nélkül történjen a magban, és nem a koristuvach rivnya szabvány könyvtáraiban. A modul funkcióként használható printk () Vagyis amikor a modul le van zárva egy további parancsra insmod a modul csatlakozik a kernelhez, és hozzáférhet a közzétett (exportált) függvényekhez és megváltoztathatja a kernelt.

String paraméter "<1>", A printk () függvénybe ütközés a prioritás. Az eredeti angol dzherelekben a loglevel kifejezést használják, ami a naplózás kifejezést jelenti. adott pályázat mi vikoristovuєmo kiemelten fontos abban az alkalomban, amikor kis számot látsz. Kiemelt prioritást élvez, hogy kérdezze meg magát, mert a jelöltek elsőbbsége miatt előfordulhat, hogy nem tud bejutni a konzolba, mert a modul telepítve van. A kernel közvetlen megváltoztatása a futó kernel verziójának, a démon verziójának lerakásának lehetőségével klogd, І az Ön konfigurációja. További részletek, egy robot funkcióval printk () Ezt a 4. fejezetben, "A fejlesztés technikája" című fejezetben olvashatjuk.

A parancs segítségével tiltakozhatsz a modul ellen insmod hogy telepítse a modult a kernelbe és a parancsokba rmmod hogy lássa a modult a kernelből. Az alján látható, hogyan változtatható az ár. Ugyanazon a belépési ponton az init_module () illeszkedik, amikor a modult telepítik a kernelbe, és a cleanup_module () akkor, ha a rendszermagból telepítik. Ne feledje, hogy csak a Koristuvach támogatásai adhatók hozzá a Vivantazhuvati modulokhoz.

A modul feneke, a guidance vishche, csak a kernellel választható ki, valamint a foreman "module version support" által is kiválasztható. Kár, hogy a rendszermaghoz több disztribúció is létezik verzióvezérléssel (erről a 11. fejezet "Kmod and Advanced Modularization" "Modulok verzióvezérlése" című szakaszában van szó. A csomag több régi verzióját szeretném modutils Nem bölcs dolog megengedni, hogy ilyen modulokat adjunk hozzá a rendszermaghoz, verzióvezérléssel kiválasztva. Nagadaєmo, a modutils csomag felfedi a programok készletét, mielőtt belépne az insmod és rmmod programokba.

Kezelő: Ellenőrizze a modul verziószámát és helyét a disztribúciójában.

Amikor megpróbál egy ilyen modult beilleszteni a kernelbe, hogy a verzióvezérlést alkalmazza, a lehető leghamarabb megismerheti a megbocsátást:

# Insmod hello.o hello.o: a kernel-modul verziója nem egyezik A hello.o-t a 2.4.20-as kernelverzióhoz fordították, míg ez a kernel a 2.4.20-9asp verziójú.

Katalózisban vegyes modulok butt az ftp.oreilly.com webhelyről, a hello.c programokból ismerni fogja az eredeti butt, hogy több mint három sorban álljon bosszút, vagy esetleg úgy van telepítve a magokba, ahogy van, így nincs szükség verziókezelésre . A Yak bi nem volt ott, erősen ajánlott a rendszermag megváltoztatása verzióvezérlés hozzáadása nélkül. Ugyanakkor ajánlott az eredeti kernel dzherel átvétele a www.kernel.org webhelyről

Ha újonc vagy a kernelgyűjteményben, próbáld meg elolvasni a cikket, mint például Alessandro Rubini (az eredeti könyv egyik szerzője), aki közzétette a http://www.linux.it/kerneldocs/kconf oldalon, és Bűnös vagyok, amiért segítettem neked a folyamat elsajátításában.

Látogassa meg a parancs szöveges konzoljait az eredeti, tompavezérelt modul összeállításához és teszteléséhez.

Root # gcc -c hello.c root # insmod ./hello.o Hello, world root # rmmod hello Viszlát kegyetlen világgyökér #

Mindig a mechanizmus kérdése, hogy melyik rendszer a sorok egyidejű átviteléhez közvetlenül a mechanizmushoz, hogy a funkciót használni tudja. printk (), Lehet látni. Az irányított alkalmazásnál úgy tűnt, hogy a modul tesztelése és tesztelése a printk () függvényből való átadás után ugyanarra a konzolra, a modulok telepítésére és indítására szolgáló parancsok pedig ugyanarra a konzolra kerültek. Egy tudáskönyv csikke egy szöveges konzolról. Yaksho vy vikonute parancs insmodі rmmod programokkal xterm Ez, shvidshe mindent, ne verj semmit a terminálon. Cserélje ki, néha használhatja például valamelyik rendszerbejelentkezést / Var / log / üzenetek. A fájl pontos neve a terjesztési készletben található. Csodálkozik a naplófájlok megváltoztatásának órájában. A printk () függvény információinak átvitelére használt mechanizmus, leírások a „Hogyan kerülnek naplózásra az üzenetek” szakaszban a 4. „Technika” részben
jóság ".

Ha egy pillantást szeretne látni a modul nézetére a rendszernaplófájlokban / val / log / messages, manuálisan használhatja a rendszer segédprogramok farkát, a módosításokhoz pedig írja be a fájlba átvitt utolsó 10 sort. Egy egyszerű segédprogram, a -f kapcsoló az indításhoz, hogy a fájlt a fennmaradó sorok utáni módban használja, így amikor új bűzsorok jelennek meg a fájlban, az automatikusan frissül. A zupiniti vikonannya parancs teljes nézetben történő futtatásához meg kell nyomnia a Ctrl + C billentyűket. Így a rendszerbejelentkezési fájl maradék tíz sorának megtekintéséhez írja be a következő parancssort:

Root # tail / var / log / messages

Yak vi can bachiti, a modul írása nem olyan ügyes, mint a zadatis. A Naivazhcha chastina egyfajta intelligencia, mennyire praktikus a beállítás, és hogyan készítsünk shvidcode modult. A tudás haladó fejezetei inkább az egyszerű modulok megírásáról szólnak, a sértő fejezetekhez pedig a mellékletek sajátosságaira van szükség.

Jellemzők a kernelmodulok és a kiegészítők között

A Dodatok egy pontot kell beírni, hogyan lehet megjavítani és azonnal megkapni kiegészítést indított a számítógép operatív memóriájában. A belépési pontot a fő () függvény írja le. A fő () függvény befejezése a program befejezését jelenti. A modulnak van néhány bemeneti pontja, amelyek a modul telepítésekor és a magból láthatóan, valamint a behatoló feldolgozásakor tápegységként jelennek meg. Tehát az init_module () belépési pontnál az a lényeg, hogy kérjünk egy olyan modult, amely a kernelbe van zárva. A cleanup_module () függvény a modul meghívásakor illeszkedik. Tanulni lehet a modul belépési pontjaiból, amelyek akkor jelennek meg, amikor a modul tápfeszültséget kap.

A modulok rögzítésének és cseréjének képessége két tényező a modularizáció mechanizmusában. A bűz különböző kulcsokkal becsülhető meg. A kiskereskedő számára az ár mindenekelőtt a kiadás órájának változását jelenti, így a trükkös újrahuzalozási folyamat nélkül tesztelheti a meghajtó funkcióit.

Programozóként tudja, hogy a kiegészítést funkcióként is lehet használni, mivel ezt nem hirdették ki mellékletben. A statikus vagy dinamikus összeállítás szakaszaiban az ilyen függvények címei az általános könyvtárakból kezdődnek. funkció printf () ezen funkciók egyike, amely a könyvtárban van feltüntetve libc... A másik oldalon a csak maggal való kötés modulja, és csak azokhoz a funkciókhoz használható, amelyeket a mag exportál. A vikonuvatsya kódja a magban nem tudja vikoristovuvat a könyvtár neveit. Tehát például a függvény printk (), Yaka vikoristovavasya a fenekében hello.c, A videó funkció analógja printf (), Kapható kiegészítők koristuvach rivnya. funkció printk () A magban elmozdult, és az anya hibája, ha lehetséges, a minimális méret. Ehhez a printf () szempontjából lehet, hogy már sokféle adat vesz körül, és például nem fogadok el lebegőpontos számokat.

A 2.0 és 2.2 kernelek megvalósítása speciális típusmeghatározó nélkül Lі Z... A Stink Booley-t csak a kernel 2.4-es verziójában vezették be.

A 2-1. ábra a wiklik függvény mechanizmusának megvalósítását mutatja, például a modulba való belépési pontokat. Hasonlóképpen a beépített modul és a maggal való intermodalitás mechanizmusának apró képe.

Kicsi. 2-1. A modul összekapcsolása a kernellel

A Unix/Linux operációs rendszerek egyik sajátossága, hogy összekapcsolhatók kernelmodulokkal. Mint már tudod, a modulok, ha zárolva vannak, a kernelhez kapcsolódnak, így minden, ami a modulodhoz szükséges, a kernel funkciói denudálva vannak a kernel fejlécfájljaiban, és jelen vannak a kernelben. Modulok widget szövegei nicoli nem bűnös, hogy speciális címsorokat tartalmaz a koristuvatsky tágasság könyvtárából. A kernelmodulok esetében kiválaszthatja, hogy csak olyan függvényeket használjon, amelyek a kernel részeként működnek.

A teljes kernel felület, a fejlécfájlokban található leírások megtalálhatók a könyvtárakban include / linuxі include / asm az összes középső cob kernel kódot /usr/src/linux-x.y.z(X.y.z a kernel verziója)). A legtöbb régebbi disztribúció (alapján libc 5-ös vagy régebbi verzió) / Usr / include / linuxі / Usr / include / asm könyvtárak megtekintéséhez a kernelforrásokban. A szimbolikus erők adott esetben a kernel interfész kiegészítések formájában történő használatára adnak hatalmat.

Nem fontos azok számára, akiknek a magból álló könyvtári interfész most megjelenik az alapfelületen, különösen az alapfolyamatok kontextusában, az alapfelület szükségessége helyes. A kernel fejlécfájljaiban azonban sok erőfeszítést kell tenni, hogy csak a magába kerüljenek be, és nem hibáztatják, hogy elérhetők a koristuvach kiegészítői számára. Annak, aki meghökkent #ifdef __KERNEL__ blokkok. Az a tengely, amiben az illesztőprogram hibás, mint a kernelkódban lévő, de egy csupasz makró szimbólummal van lefordítva __KERNEL__.

A kernelfájlokban található további fejlécek szerepét a későbbiekben tárgyaljuk, ha szükséges.

Azok a fejlesztők, akik nagyszerű szoftverprojektekkel (például a maggal) dolgoznak, a vrahovuvatit és az unicati-t hibáztatják "Zabrudneniya a férfiak hatalmasságába"... Qia probléma a nyilvánvalósággal remek szám Az emberek funkciói és globális változásai nem nagyon különböznek egymástól (emlékeztek). A programozó, aki örülni fog az ilyen kiegészítőknek, több mint egy órán keresztül fogja mondani az anyának, hogy emlékezzen a „fenntartott” nevekre, és találjon ki egyedi neveket az új elemekhez. A nevek száma (kétértelműség) sokféle problémát megoldhat, a modul zárolt állapotában a kegyelmek rögzítése, a program instabil vagy indokolatlan viselkedése véget vetve, mivel ez megnyilvánulhat a korisztikában, valamint a győztes magban, a bizalmas

A gyártók nem engedélyezhetnek ilyen megbocsátást a kernelkód írásakor, így maga a legkisebb modul is kapcsolódik a kernelhez. Olyan megoldásokat ecsetelünk, amelyek segítségével megszabadulhatunk a nevek kolosszusától є, a Pershe-ben, objektumok lefedése yak programokkal statikus, És másképpen a globális objektumok menuvannya viktoriánusa egyedi, a rendszerek határaiban, előtag. Ezenkívül a modul fejlesztőjeként Ön szabályozhatja a kódban lévő objektumok láthatósági területeit, a „Kernel linkelési tábla” részben leírtak szerint.

A parancs legtöbb (de nem minden) verziója insmod Exportálja a modul összes objektumát, mindaddig, amíg nem csupasz statikus Az okok miatt, vagyis a modulokban nincs külön utasítás az egész rakhunokra vonatkozóan. Ehhez teljesen ésszerű további alkatrészeket kitenni, ha nem megy az export, akkor jak statikus.

Vikoristannya egyedi előtag a helyi létesítményekhez a modul közepén jó gyakorlat lehet, ezért egy szívességet kérek. Az illesztőprogram egy órás tesztelése után megtudhatja, hogyan exportálhat további objektumokat a kernelbe. Ha egyedi előtagja van egy adott névnek, akkor nem szeretne kolóniát létrehozni a kernel nevének mezőjében. Előtagok, hogyan legyünk győztesek a magban, az otthonosságért, vicariáns használjuk az alsó regiszter szimbólumait, és elégedettek leszünk az egésszel.

Van még egy különbség a mag és a corystuvach jelzései között a pázsitfű feldolgozási mechanizmusában a tisztítási folyamatok alapján. A bûnözõk számára kijelölt folyamathoz az ellenõrzés vikonannya lényege, hogy a bûnözõknek kijelölt folyamatban a bûnözõk számára a megbocsátás az, hogy a rendszer számára nem sokkoló hibát produkáljunk: szegmentációs hibát. Ugyanakkor Ön lehet a vikoristany vіdladchik tulajdonosa a vіdsthezhennya pardon y vіchіdnuyu kódhoz, amely a corystuvach programokhoz van hozzárendelve. A kegyelmek a magban végzetesek – ha nem is az egész rendszerre, de legalábbis a tevékenység folyamához kötve. A razdіlі "Rendszer támogatásainak javítása" 4. fejezet "A fejlesztés technikája" című fejezetében láthatjuk a kernelek levágásának módjait.

Magtér és a mag tere

A modul látogatására az ún a mag nyitott terei, Todi yak dodatki pratsyuut v. Qia koncepció - az operációs rendszerek elméletének alapja.

A szakterület operációs rendszerének egyik fő jellemzője az adott koristuvachban és a számítógépes erőforrások koristuvach programjainak kijelölése, amelyek többsége képviselve van melléképületek... Az operációs rendszer nemcsak az erőforrásokhoz való hozzáférés biztosításában vétkes, hanem a videó és a regisztráció feletti ellenőrzésben is, hogy megakadályozza a számos és jogosulatlan hozzáférést. A tsiogo kiegészítéseként operációs rendszer Beállíthat független műveleteket a programhoz, és meg kell tisztítani az erőforrásokhoz való jogosulatlan hozzáféréstől. a tsієї dátuma nem triviális buzgalom Ez csak abban az esetben lehetséges, ha a processzor nem a koristuvach adataiból gondoskodik a rendszerprogramokról.

Gyakorlatilag bőrbarát processzor az ilyen podil biztosításához, a kiválasztott kódhoz tartozó új jogosultságok megvalósításához (legalább két egyenlő). Például az I32 architektúra processzorai egyenlő jogosultságokat választhatnak 0-tól 3-ig. Ezenkívül a 0-s szint jogosultsággá válhat. Az ilyen processzorokhoz van egy olyan preferenciális utasítás, amely csak a kívánt szinteken jeleníthető meg. Unix rendszer és vicoristovuyut két egyenlő processzorjogosultság. Mivel a processzor több mint két év kiváltságos, így a vikárista lesz a legalacsonyabb és a legjobb. A Unix kernel be van kapcsolva a legjobb barátnak privileiv, a koristuvach birtokának és folyamatainak biztonságos kezelése.

Ha már arról beszélünk a mag nyitott tereiі a folyamat számára kijelölt hely megtéveszteni nemcsak a kiválasztott kód javára való különbséget, hanem a nagy címet is.

A Unix a kijelölt folyamat hatalmas területéről a kernelbe két változatban költözik. Először is, ha a vicon koristuvalnitsky-kiegészítése tökre van (szisztémás wiklik), másként pedig a berendezés szervizelésének órájáról. Kernelkód, amely akkor jelenik meg, amikor egy rendszer wikklick egy folyamat kontextusában működik, Tobto pratsuyuchi a wiklik érdekében ebben a folyamatban hozzáférhet a folyamat címteréhez. Másrészt a vikonuvannya kódja az eszköz szervizelése során є aszinkron, a folyamatnak megfelelően, és nem vonatkozik egyetlen folyamatra sem.

A terület moduljainak kijelölése a kernel kiterjesztett funkcionalitásában. A modul kódja elérhető a kernelterületen. Kérem, a modul rendben van, sérti a vezetőt, ahogy korábban említette: a modul funkciói a rendszer wiki részeként jelennek meg, és a műveletek az átvitel kezeléséhez szükségesek.

Párhuzamos a magban

Mellékletmeghajtók programozásánál, a programozott kiegészítések kijelzőjén különösen érdemes a kiválasztott kód párhuzamosításáról betáplálni. Általános szabály, hogy a táplálékkiegészítőt a csutkától az utolsó nap végéig szedik, anélkül, hogy aggódnának az otochenya változása miatt. A kernel kódja okolható az urahuvannyáért, hogy egy óráig lehet nyerni egy vadállat gerincét.

Nincsenek nyilvánvaló okok a kernelkód párhuzamosítására. Ugyanígy nincs probléma a Linux futtatásával, és ezek miatt egyik napról a másikra a modul kódjához lehet fordulni. A Bagato-mellékletek tönkretehetik a processzor hardverét. A szondák pererivan wiklikayutsya aszinkron módon і lehet wiklicans abban a pillanatban, ha a vezető részt vesz a wikonannyy tápegység. A szoftverabsztrakciók Deyaki-ja (mint például a kernel-időzítők, a 6. „Időfolyam” fejezetben leírtak szerint) szintén aszinkron módon fut. Ezenkívül a Linux futhat szimmetrikus többprocesszoros (SMP) rendszereken is, így az illesztőprogram kódja egy óra alatt egyidejűleg megtekinthető asztali processzorokon.

Három okból kifolyólag a Linux kernelkód, beleértve az illesztőprogram-kódokat is, újra felcserélhető, tehát bűnös, ha több, egyik napról a másikra adott kontextusra épül. E bűnös felek szerkezete a decilisfolyamok párhuzamos eloszlásából bontható ki. Saját szíve szerint a rendszermag kódja számos párhuzamos adatfolyam felépítésében vétkes, amelyek nem lehetségesek. Egy olyan kód írása, amely párhuzamosan és egyedi helyzetekben is megjeleníthető, amiben ez utóbbi a rendszer indokolatlan problémájához vezethet, sok óra alatt, és esetleg trükközéshez is. A ts_y kniz_ben lévő sofőr bőrfeneke a nyöszörgő vikonannya szavaiból van kiírva. Ha szükséges, elmagyarázzuk az ilyen kód írási technikájának sajátosságait.

Naybіlsh zagalnaya pomorka, mint elismerni a programokat a mező bennük, de a párhuzamosság nem probléma, a deyakі szegmens kód egy része nem mehet az "alvótáborba". Valójában a Linux kernel nem életképes, és egy fontos támpont, hogy egy órán keresztül nem lehet átírni a processzort, ami a kernel kódja szempontjából fontos. Marad egy óra, a nem teherbíró képességhez az esetek többségében a tehermentesség is hozzáadódik. Az SMP rendszereken azonban nem szükséges a kód élénkítése párhuzamos számítással.

Amíg a kód átvitele folyamatban van, ha nem lesz élénk, akkor nem lesz megfelelően feldolgozva az SMP rendszereken. Navi ha nem ismered a rendszert, її tud ma htos іnshy, milyen vikárista a kódod. Hasonlóképpen, talán a jövőben a magban ott lesz a vikoristovuyuvatsya képesség, hogy az egyfolyamatos rendszerekben navigálni és az anya mindenhol párhuzamosan haladjon. Az ilyen kernelek megvalósítására is vannak lehetőségek. Ilyen rangban egy intelligens programozó az indításkor megírja a kernel kódját, így az SMP-vel rendelkező rendszereken fog működni.

kb. váltás: Vibachte, csak az utolsó két bekezdés, nem hangzik. Lehet, hogy a tse egy rossz átvitel eredménye. Elmondom az eredeti szöveget.

Az illesztőprogram-programozók által elkövetett gyakori hiba az, hogy azt feltételezik, hogy a párhuzamosság nem jelent problémát mindaddig, amíg egy adott kódszegmens
nem alszik el (vagy "blokk"). Igaz, hogy a Linux kernel nem megelőző jellegű; fontos kivételével
szervizelési megszakítások esetén nem veszi el a processzort azoktól a kernelkódoktól, amelyek nem adják meg magukat. A múlt időkben ez nem megelőző
viselkedése elegendő volt a nem kívánt egyidejűség megelőzésére. Az SMP rendszereken azonban nem szükséges elővásárlás az okozáshoz
párhuzamos végrehajtás.

Ha a kód azt feltételezi, hogy nem lesz előlegezve, akkor nem fog megfelelően futni az SMP rendszereken. Még ha nem is rendelkezik ilyen rendszerrel,
másoknak, akik az Ön kódját futtatják, lehet egy ilyen. A jövőben az is lehetséges, hogy a kernel megelőző üzemmódba kerül,
ekkor még az egyprocesszoros rendszereknek is mindenhol foglalkozniuk kell a párhuzamossággal (a kernel egyes változatai már megvalósultak
azt).

Információk a befűzési folyamatról

Ha a kód a kernel modul nem vikonutsya utolsó, kiegészítésként, összesen több állatot a kernel vikonuyutsya, amely fordult az új, folyamat. A kernelkód wikifolyamatként ismerhető fel egy globális varázsló elindításával, amely a szerkezetre vonatkozik struktúra feladat_struktúra, Pevnu, 2.4-es verziójú kernelekhez, fájlban , Tartalmazza ... showman jelenlegi vkazu a jelenlegi scho vikonutsya koristuvalnitsky folyamatról. Amikor az ilyen rendszerszintű győzelmek győztesek nyisd ki () abo Bezárás (), Obov'yazkovo ісnuє process wiklikav їх. A kernelkód, ha szükséges, törölheti a törlési folyamatra vonatkozó konkrét információkat az indikátoron keresztül jelenlegi... Csatoljon egy victorian egy tsiy indikátort, amelyet az 5. szakasz "Továbbfejlesztett Char Driver-műveletek" "A fájlmelléklethez való hozzáférés szabályozása" szakaszában ismerhet.

Az idei napra, showman jelenlegi nem sok globális változás, mint a kernel korai verzióiban. A kereskedők optimalizálták a szerkezethez való hozzáférést, mivel leírják az áramlási folyamatot, amikor azt a verem oldalára helyezik. Az aktuális megvalósítás részleteire kíváncsi lehet a fájlban ... Lehet, hogy ott nem bocsátod meg a neked tetsző kódot. Lehet, hogy uvaz-on, mivel a Linux nem SMP alapú rendszer, és a globális változás egyszerűen nem lesz sikeres, ha igazad lesz CPU nélkül. A megvalósítás részletei a többi kernel-alrendszernél elvesznek, az illesztőprogramot a kijelzőhöz lehet csatolni jelenlegi csak a felületen keresztül .

A modul szempontjából jelenlegi hasonló kiemelés posilannya printk ()... Modul vikoristovuvati jelenlegi mindenhol szükséges. Például az shmatok kód kezdete egy másik azonosító (folyamatazonosító - PID), valamint a parancs és a wiki a folyamat moduljába, amely a szerkezeti mezőkön keresztül olvasható. struktúra feladat_struktúra:

Printk ("A folyamat a következő: \"% s \ "(pid% i) \ n", aktuális-> komm, aktuális-> pid);

A current-> comm є ім'я mező parancsfájlja szálfűzési folyamatot indított el.

Modulok összeállítása, előzetes hozzárendelése

A feladatok központi fejezetének többi része a kész, ha nem is atipikus modulhoz íródott. Ez azt jelenti, hogy a modult nem szabad ugyanabban az osztályban elhelyezni, mint a „Mellékletek és modulok osztályai” című szakaszban, az 1. „Hozzáadva a mellékletek illesztőprogramjához” szakaszban. Az elosztásban látható illesztőprogram alkalmazásának neve koponya (Simple Kernel Utility for Loading Localities) lesz. A scull modult sablonként használhatja saját helyi kódjának írásához.

Saját vikoristovuєmo megértése "helyi kód" (helyi), hogy támogassa a személyes változtatásokat a kódot, a régi szép időkben a Unix (/ usr / local).

Ez előtt azonban olyan, mint az init_module () és a cleanup_module () függvény, írunk egy Makefile szkriptet, amelyet a make segédprogrammal készítünk el, hogy a modult relevánssá tegyük a kódhoz.

Tim, mint előfeldolgozó előtt fel kell dolgozni a #define direktívával rendelkező fejléceket és a __KERNEL__ makrószimbólum értékeit. A korábbiakhoz hasonlóan a kernel interfész fájljaiban is lehet kernel-specifikus kontextus, amely csak akkor látható, ha a __KERNEL__ szimbólum a múltban az előfeldolgozási szakaszban hozzá lett rendelve.

Egy fontos szimbólum, amelyet a #define direktíva jelez, a MODUL szimbólum. Bűnös vagyok a felület bekapcsolása előtti értékekben (A Viklyuchuyuchi illesztőprogramok egyszerre lesznek kiválasztva a kernellel). Ebben a könyvben NEM ismertetjük azokat a meghajtókat, amelyek a magba mennek, így a MODUL szimbólum minden fenekünkben jelen lesz.

Amikor kiválasztunk egy SMP-rendszer modult, akkor az __SMP__ makrószimbólumnak is szerepelnie kell a benne lévő kernel interfészek előtt. A kernel 2.2-es verziójában a kernel konfigurációjában az elemet az egyprocesszoros és többprocesszoros rendszer közötti rezgés hozzáadására korlátozzuk. Ehhez a továbbfejlesztett sorok beépítése a modul következő soraiba a bagatoprocessing rendszer beállításáig felkerül.

#beleértve #ifdef CONFIG_SMP # define __SMP__ #endif

A modul fejlesztői felelősek az optimalizációk fontosságáért is -O a fordító számára, ehhez rengeteg inline függvény található a kernel fejlécfájljaiban. A gcc fordító nem kínál soron belüli kiterjesztést a függvényekhez, amíg az optimalizálás nem engedélyezett. A soron belüli beállítások kiterjesztését a további -g és -O opciók mögött neveztem meg, hogy általánosságban lehetővé tegye a beépített funkció kódjának hozzáadását a hibakeresőhöz. Tehát, mivel a mag nagyjából ördögi beépített funkcionalitás, még fontosabb, hogy a bűz megfelelően legyen kitágítva.

Tisztelet azonban, hogy a viktoriánus be-optimizatsii ryvnya-O2 emelkedett, mert a fordító bővíthető, és azokat a funkciókat, amelyeket nem ír le inline. Ez problémákhoz vezethet, így egyes függvények kódja törölhető a wiklik szabványos veremének megismeréséhez. A soron belüli kiterjesztéseknél ésszerű beszúrni a függvénykódot a wikliku pontjába, hogy lecserélje a wikklik függvény utasításait. Nyilvánvalóan ugyanakkor, mivel nincs wiklik függvény, nincs verem wiklik.

Lehetséges, át kell gondolni, hogy a modulok fordításához ugyanazt a fordítót használjuk, amely ugyanaz a fordító a kernel összegyűjtésére, ebben az esetben a modul átkerül a telepítéshez. További információ a fájlban található eredeti dokumentumról Dokumentáció / Változások katalose dzherel magokban rosted. A mag és a fordító fejlesztése általában szinkronizálva van a fejlesztők csoportjai között. Előfordulhat, hogy leesik, ha először kinyitja valamelyik elemet. A Deyaky disztribúciós készletek a fordító rendkívül új verzióit kínálják, amelyek nem egyeznek a vibrán kernellel. Van egy vipadku, büdös, sikít, nadayut okremiy csomag (gyakran címek kgcc) Speciálisan arra tervezett fordítóval
kernel összeállítások.

Nareshti, hogy emlékezzen a kegyelmekre, javasoljuk az összeállítás lehetőségét -Fal(Minden figyelmeztetés – minden elhasználódott). Minden idők megelégedésére meg kell változtatnia speciális programozási stílusát. A kernelkód írásakor Linus Torvalds kódolási stílusa élénkebb, mint a vikoristovuvati javaslati stílus. Szóval, dokumentálj Dokumentáció / CodingStyle, a kernel dzherel katalógusából, hogy kiegészítse az ajánlások listáját minden csapatnak, akiknek hivatkozniuk kell a kernel programjaira.

A közelmúltban tanult modul összeállításait télen javasolt megváltoztatni ZÁSZLÓK a Makefile-d. Kihasználtság szempontjából tegyük különlegessé az egészet, ahogy ezt egy hamis leírásból is látom.

Krim praporiv télen ZÁSZLÓK, A Makefile tartalmazhat egy meta-t, például egy közös fájlt. Egy ilyen meta csak abban az esetben szükséges, ha a disztribúciók moduljának kódja számos fájlhoz egy dzherelben, nos, vzagal, nem є ridkistu. Ob'ktnі fájlok ob'nuyutsya parancsot ld -r, A Yaka nem egy távérzékelési összekötő művelet, ne csodálkozz a linkelési műveleten ( ld). A győztes parancs eredménye ld -rє і. választási lehetőség -r jelentése " költözhető – költöztetés", Azaz a parancsfájl a címtérbe kerül, mivel az abszolút címek és függvények még nincsenek beállítva az újban.

A reprezentációk támadó alkalmazásához a modul összeállításához szükséges a minimális Makefile, amely két fájlban van tárolva. Ha a modul egy jerel fájlban van tárolva, akkor a célzott seggből javítania kell a meta-t, hogy bosszút álljon a parancsért ld -r.

# Itt léphet be a kernel dzherel könyvtárába, # vagy átadhatja paraméterként a "make" wiklik-ben KERNELDIR = / usr / src / linux include $ (KERNELDIR) /. Config CFLAGS = -D__KERNEL__ -DMODULE -I $ (KERNELDIR) / include \ -O -Wall ifdef CONFIG_SMP CFLAGS + = -D__SMP__ -DSMP endif all: skull.o skull.o: skull_init.o skull_clean.o $ (LD) r $ ^ -o [E-mail védett] tiszta: rm -f * .o * ~ mag

Amint megtudja a fenét a make segédprogramról, megteheti, láthatja a * .c fájlok fordításának szabályait a * .o fájlokban. Mivel ezekre a szabályokra nincs szükség, a make segédprogram szükség esetén maga is átírja a * .c fájlokat * .o fájlokba. $ (CC)... Sok változtatással $ (CFLAGS) vikoristovuyutsya összeállítások megrendelésére.

Rövid időn belül, ha azt szeretné, hogy a modul belegabalyodjon a kernelbe. Azt már mondtuk, hogy mindannyiunk számára használhatjuk majd az insmod segédprogramot, mivel a futó kernel szimbólumtáblájából lekötöm a modul összes lényegtelen szimbólumát (function wicks és in.). A linker (például egy ilyen yak ld) nézetében azonban nem a modul lemezfájljában történik változás, hanem a modul objektum csatolása a működési memóriához, amely a kernelhez kapcsolódik. Az insmod segédprogram képes elfogadni a parancssor opciókat. Végig megcsodálhatod a részleteket man insmod... Kijelölhet például egy éneklő célpontot és egy karakterlánc változtatást a moduljában érték beállítása mielőtt a modult a kernelhez kapcsolná. Ilyen rangban, ha a modul megfelelően van felosztva, a rögzítés szakaszában állítható. A modul ilyen konfigurálási módja nagy gondot okoz a konfigurációnak a fordítás szakaszában. Az előzetes hozzárendelés szakaszában történő konfigurálást a "Kézi és automatikusan konfigurálható" fejezet ismerteti további részletekért.

A Deyakim olvasói az insmod robotikus segédprogramjainak részleteit találhatják meg. Az insmod megvalósítása nem a kernel / module.c fájlban található néhány rendszer wiklicken alapul. A sys_create_module () függvény sok memóriát hoz létre a kernel címterében a zárolandó modul számára. A memória elérhető a vmalloc () kiegészítő funkcióhoz (Rozdil "vmalloc and Friends" rész a 7. "Memória megszerzése" részben). A wikelik get_kernel_sysms () rendszer elforgatja a kernelszimbólum-táblázatot, mivel a vicoristan az objektumok valós címét fogja megjeleníteni linkeléskor. A sys_init_module () függvény a modul általános kódját a kernel és a wikipédia címterébe másolja a modulfüggvény inicializálásához.

Ha kíváncsi a dzherel kernelkódra, akkor tudni fogja az ott található rendszerwikik nevét, amelyek a sys_ előtagból javíthatók. A Tsei előtagja csak a rendszerszintű győzelmekre vonatkozik. Néhány funkció nem hibás ebben. Legyen az ár az oldal tetején, amikor a kernel kódot a grep vicc segítségével feldolgozták.

ugar változat

Ha ennél többet nem tudsz, az itt elhangzik, akkor mindenre jobb, ha az általad hibáztatott modulokat újrafordítják a nucleus skin változatára, mint ahogy az ottani bűz linkelni fog. A skin modul felelős a szimbólumokért, címekért __module_kernel_version, A yakogo értéke
Tesztelje a streaming kernel verzióját az insmod segédprogrammal. Tsey a hímzés szimbóluma a részben .modinfo fájlokat ELF-ben (végrehajtható és linkelő formátum). További részletek a 11. fejezetben találhatók, „Kmod és speciális modularizáció”. Legyen menyét tisztelet, van mód a verziók ellenőrzésére csak a 2.2-es és 2.4-es kernel verzióihoz telepíthető. A 2.0-s verzió kernelében az ár olcsón jelenik meg.

A fordítónak mindenhol szimbólumot kell hozzárendelnie, ha fejléceket is tartalmaz ... Erre a korábbi lebegésben a hello.c alkalmazás nem írta le a szimbólumot. Ez azt is jelenti, hogy ha a modult a dzherelben nem tárolja fájl, akkor a fájlt bele kell foglalnia a kódodban csak egyszer. Vinyatka є vipadok vikoristannya viznachennya __NO_VERSION__, Amelyben többet megtudhatunk.

Az alsó pont a module.h fájlban leírt szimbólum értéke és a 2.4.25 kernelkód.

Static const char __module_kernel_versio / PRE__attribute __ ((szakasz (. Modinfo"))) = "kernel_verzió =" UTS_RELEASE;

Ha a verziók inkonzisztenciája miatt módosul a modul, akkor lehetőség van a modul tesztelésére az insmod kulcs átadásával a paraméterek sorába. -f(Kényszerítés). A modul biztonságos rögzítésének ez a módja nem biztonságos, és soha nem is sikeres. Az esetleges szerencsétlenségek okainak magyarázata fontos, hogy befejezze. Előfordulhat, hogy a modul nem záródik le a szimbólumok összekapcsolásának hiánya miatt a linkelés során. Általában nem szabad megfeledkezni a kegyelemről. A kudarc okai a robotok változásában vagy az atommag felépítésében keresendők. Általánosságban elmondható, hogy a modul blokkolása komoly megbocsátáshoz vezethet a vikonannya idejére, valamint a rendszer összeomlásához (rendszerpánik). A fennmaradás jó ösztönzésként szolgál majd a rendszer és a verzióellenőrzés felülvizsgálatához. A verziókonzisztencia elegánsabban szabályozható, ha a rendszermagban szabályozza a verziókat. Erről részletesen a „Kmod and Advanced Modularization” 11. fejezet „Modulok verzióvezérlése” című része.

Ha egy adott kernelverzióhoz szeretné lefordítani a modult, kérjük, mellékelje magából a kernelverzióból származó fejlécfájlt. Leírja az alkalmazás Makefile for vysnachennya könyvtárát a cich fájlok vikoristovuvalasya zminna terjesztéséhez KERNELDIR... Egy ilyen egyéni összeállítás nem, a kernel dzherel jelenlétével. Ezenkívül gyakran előfordul, hogy a kernel régebbi verziói megjelennek a könyvtárfában. Minden a modulok fenekének aljára irányul, vikoristovuyt zminnu KERNELDIR a disztribúció hozzáadásához a dzherel könyvtárához a kernelnek ez a verziója, amelybe a kiválasztott modul hivatkozása átkerül. Könyvtár hozzáadásához használhat rendszermódosítást, vagy viheti át a make segédprogram parancssorának paraméterein keresztül.

Amikor a modul le van zárva, az insmod segédprogram a saját erejével viccelődik a modul fájljaival, megnézi a kiesett katalógusok verzióját, és pontokból kijavítja. / Lib / modulok... Szeretném, ha a segédprogram régi verziója viccet tartalmazna egy adatfolyam-katalógusban, az ilyen viselkedés azonnal elfogadhatatlan kudarcok miatt (problémák, PÁLYA). Ilyen rangban, ha le akarjuk zárni a modult a folyamkatalógusból, hozzáadhatjuk a stílushoz ./module.o... Így a modul az insmod segédprogramok bármely verziójához használható.

Bizonyos esetekben elérheti a kernel interfészt, amint az a 2.0.x és 2.4.x verziókban is látható. Általában be kell menned a makróba, hogy segíts, ezért elindítom a kernel szálfűző verzióját. A fejlécek varrásának dán makrója ... Az ilyen győzelmekkel járó felületek láthatósága is visszaesik. Megtörhető akár azonnal a leírás mentén, akár az utolsó részben, a parlagon kívüli változatok hozzárendelésére szolgáló speciális részben. A Vinos egy részlet a körülötte lévő részben, valami vipadkban, amivel nem lehet gyorsítani a leírást a kernel 2.4.x verziója szerint.

Címszavakban linux / version.h Az induló makrók értékei a kernelverzió értékeihez kapcsolódnak.

UTS_RELEASE A sorban bővülő makró leírja a streaming magjának verzióját
cob fa kódok. Például a makró kibővíthető taku-ra
sor: "2.3.48" . LINUX_VERSION_CODE A teljes makró a kernel bináris változatában bővül, aszerint
egy bájt a szám bőrrészénként. Például binarne
hozzáfűzve a 2.3.48 bude 131888 verzióhoz (több tucat
hex 0x020330 esetén). Mozhlivo, bіnarne
yyavlenya többet kapsz, mint egy húr. Tiszteld, fogadd el
az engedély nyilatkozata legfeljebb 256 lehetőség leírására a bőrön
szám részei. KERNEL_VERSION (nagy, mellék, kiadás) Ez a makróérték a „kernel_version_code” használatával engedélyezett
az egyes elemektől a mag raktári változatáig. mellesleg,
bezár KERNEL_VERSION (2, 3, 48)
bontsa ki 131888-ra. A makró értéke manuálisan állítható be, amikor
A kernel rutinszálas változata a szükségesekkel. Többször leszünk
vikoristovuvati tse makróérték nyúlik ki az egész könyvet.

Fájlra mutat linux / version.h a 2.4.25-ös kernelhez (a fejlécek szövege fölé kerül).

#define UTS_RELEASE "2.4.25" #define LINUX_VERSION_CODE 132121 #define KERNEL_VERSION (a, b, c) (((a)<< 16) + ((b) << 8) + (c))

A version.h fejlécek a module.h fájlban találhatók, így általában nem kell kifejezetten szerepeltetnie a version.h-t a modul kódjában. Másrészt ügyeljen arra, hogy a version.h fejléceket tartalmazza a module.h fájlban egy baked makró esetén __NO_VERSION__... Vicoristovuvati leszel __NO_VERSION__, Például, ha be kell kapcsolnia számos dzherel fájlban, amelyek az időtartamra egyetlen modulba kapcsolódnak. meztelenség __NO_VERSION__ a mellékelt fejlécek modul előtt.h zapobіgaє
automatikus sorleírás __module_kernel_version abo її megfelelője dzherel fájlokban. Mozhlivo, ne lepődj meg azon, hogy elégedett vagy a skarg linkelésével ld -r, Yakuyou nem lesz méltó a szimbólumok többszörös leírására a hivatkozási táblázatokban. Név, ha a terjesztési modul kódja szerepel a mappában lévő fájlok számán, ha ad meg fejlécet Ez a meztelenség __NO_VERSION__ hogy egy kivételével minden fájltól féljen. A könyvben a modul feneke hegyes, __NO_VERSION__.

A kernel verziójához kapcsolódó nagyszámú letét feltörhető további logika miatt, amelyet az előfeldolgozó direktívái kérnek a makróértékekkel KERNEL_VERSIONі LINUX_VERSION_CODE... A verziók lerakásának megfordítása azonban nagyban felgyorsíthatja a modulkód olvashatóságát a durva direktívák elosztásához #ifdef... Ehhez énekelni a legszebb megoldásokat є vonzza a betétek konvertálását az okremiy fejlécfájlba. A fenekünk tengelye fejléceket tartalmaz sysdep.h, Yakiy vikoristovuєtsya az új összes makroértékben való elosztáshoz, a verziók elhelyezésének változásaihoz kötve.

Az első verzió elavult, szeretném elképzelni, hogy egy csupasz fémben vagyok." telepítse"Az illesztőprogramunk összeállításának forgatókönyve. Megtisztíthattad volna a telepítési könyvtárat, amely egyről a kernel viktoriánus verziójára változott, vibrált a version.h fájl alapján. Egy kódrészlet a fájlból volt megjelenítve. Szabályok.make, Yakiy vikorystovuєtsya usіma Makefile kernel.

VERSIONFILE = $ (INCLUDEDIR) /linux/version.h VREION = $ (shell awk -F \ "" / REL / ($$ 2 nyomtatása) "$ (VERSIONFILE)) INSTALDIR = / lib / modules / $ (VERSION) / egyéb

Tanúi tisztelet, minden illesztőprogramunk telepítése miatt a misc könyvtár győzött. A 2.4-es kernel verziótól való javítást követően a katalógus az illesztőprogramok szolgáltatásainak terjesztéséhez ajánlott. Ráadásul a modutils csomag régi és új verziójában is a maga módján viccből megtalálható a misc katalógus.

A Vikoristovuchi INSTALLDIR formában van megadva, a Makefile telepítési meta a következő rangban látható:

Telepítés: install -d $ (INSTALLDIR) install -c $ (OBJS) $ (INSTALLDIR)

A platformok előfordulása

A skin számítógépes platformnak megvannak a maga specialitásai, amelyek vétkesek abban, hogy a központi fejlesztők biztosítják a legmagasabb termelékenység elérése érdekében.

A kernelgyártók nagyobb szabadságot kaphatnak a választásban, és elfogadhatják a megoldásokat / PCLASS = "western" és további adatok szállítói. Ugyanez a szabadság lehetővé teszi a kód optimalizálását, maximum skin-specifikus platformokat használhat.

A modul kódja hibás, de magukból a fordító opcióiból fordítják le, mint a logikai értékek a kernel fordításakor. A feldolgozói regiszterek azonos regisztrációs sémáinak regisztrációjáig, és egy és ugyanazon optimalizálás megerősítéséig kell alkalmazni. fájlt Szabályok.make Gyökerezzen a fa dzherel magjainak gyökereibe, beleértve a hordozható ugarfákat is, amelyek szerepelnek a Makefile összeállításban. Minden hordozható fordítási szkriptet Makefile-nek hívnak. felületés a változtatások értékeit kihasználni a make hasznosítására a kernel aktuális áramlási konfigurációjában.

A Іnshoyu tsіkаvoi speciális Makefile támogatja a többplatformos vagy csak kereszt-összeállítást. Tsei kifejezés vikoristovuyutsya szükség esetén fordítási kódot іnshoї platformokhoz. Például, ha az i86 platformot használja, nyissa meg az M68000 platformok kódját. Ha keresztfordítást keres, akkor le kell cserélnie a fordítási eszközeit ( gcc, ld, Ta ін.)
(Például, m68k-linux-gcc, m68k-linux-ld). A Vikoristovuvaniyu előtagok a $ (CROSS_COMPILE) Makefile módosításával, vagy a make használatához vagy a rendszer megváltoztatásához szükséges parancssori paraméterrel készíthetők.

A SPARC architektúra egy nagyon különleges téma, ami okolható a Makefile bizonyos rangú hibáiért. A programok SPARC64 (SPARC V9) platformokon és bináris fájlokon való futtatásra készültek, általában SPARC32 (SPARC V8) platformokra tervezték. Ezenkívül a fordító képes lesz SPARC64 (gcc) platformokon futni, és generikus kódot generálni a SPARC32 számára. Másrészt a magot a SPARC V9 robotjainak szánják, a SPARC V9 kódjának felfedésében; Minden SPARC64-hez kijelölt GNU/Linux disztribúció tartalmaz egyfajta keresztfordítót, amelyet a kernel fordítási szkriptjének Makefile-jában kell rezegnie.

Szeretnék egy további listát a trocha összes verziójának és platformjának betéteiről, néhány leírás itt, összesen elég a kereszt-összeállítás megjelenítéséhez. További információk eltávolításához megcsodálhatja a fordítási szkript Makefile-jét és a kernel jerel fájlját.

Kernel 2.6 szolgáltatásai

Egy óra nem éri meg. Egyetlen villanással megjelent a 2.6-os kernel új generációja. Sajnos ennek a könyvnek az eredeti példányai nem tekintenek új magra;

Használhatja az integrált köztes szoftvereket, például a TimeSys TimeStormát, hogy helyesen alakítsa ki a kulcsot és a fordítási szkriptet a modulhoz, a kernel szükséges verziójától függően. Ha úgy dönt, hogy mindent önállóan ír, akkor megismerheti a deyak dodatkov információkat az új mag által hozott fő gondolatokról.

A 2.6-os kernel egyik jellemzője, hogy érvényesíteni kell a module_init () és a module_exit () makrókat a funkciók explicit visszaállításához és véglegesítéséhez.

Makroértékű MODULE_LISENCE (), amely a 2.4-es kernelekben bevezetett és korábban szükséges, ha nem akar további változtatásokat végrehajtani a modul zárolásakor. Kiválaszthatja a következő lépéseket a licencek hozzárendeléséhez a makróátvitelhez: "GPL", "GPL v2", "GPL és további jogok", "Kettős BSD / GPL" (BSD vagy GPL licencek közül választhat), "Kettős MPL / GPL" (Vibir mіzh Mozilla vagy GPL licencek) i
"Szabadalmazott".

A Bilsh suttєvim az új kernelhez є egy új modulok fordítási séma, ami nem csak magának a modulnak a kódjában, hanem a fordítás szkriptjének Makefile-jában történt változásokról szól.

Így a MODULE makró szimbólum értéke már nem szükséges a modul kódjában vagy a Makefile-ban. Ha szükséges, az új fordítási séma maga is hozzárendeli a makrószimbólumokat. Ezenkívül nem tud kifejezetten a __KERNEL__ makrókról vagy az újakról, mint például a KBUILD_BASENAME és a KBUILD_MODNAME.

Továbbá, ha nem hibás abban, hogy fordításkor elindította az optimalizálási szintet (-O2 vagy egyéb), akkor a modulja ezzel a szabályrendszerrel lesz lefordítva, beleértve az optimalizálást is, akkor az összes mag automatikusan le lesz fordítva. szabályokról.

Három okból kifolyólag a 2.6-os kernelhez való modul fordítására szolgáló Makefile valamivel egyszerűbb. Tehát a hello.c Makefile modul számára ez lesz a következő rang:

Obj-m: = hello.o

A modul lefordításához azonban írási hozzáférésre lesz szüksége a kernel dzherel fához, így lesznek órafájlok és könyvtárak. Éppen ezért a modul 2.6-os kernelig történő fordítására, a stream könyvtárból történő beállítására, a modul dzherel kódjának megbosszulására vonatkozó parancs a következő sorrendben vétkes:

# Make -C /usr/src/linux-2.6.1 SUBDIRS = `pwd` modulok

Otzhe, maєmo dzherelo modul helló-2.6.c A 2.6-os kernelben való fordításhoz:

//hello-2.6.c #include #beleértve #beleértve MODULE_LICENSE ("GPL"); static int __init my_init (void) (printk ("Hello world \ n"); return 0;); static void __exit my_cleanup (void) (printk ("Viszlát \ n");); modul_init (my_init); modul_exit (my_cleanup);

Úgy tűnik, a Makefile:

Obj-m: = hello-2.6.o

A Wiklikє a make paranccsal tudja elemezni a Makefile-t a rendelkezésre álló paraméterekkel:

# Make -C / usr / src / linux-2.6.3 SUBDIRS = `pwd` modulok

A szokásos fordítási folyamat a következő szabványos frissítésen megy keresztül:

Make: Lépjen be a `/usr/src/linux-2.6.3" könyvtárba. *** Figyelmeztetés: A SUBDIRS parancssorbeli felülírása *** inkonzisztenciát okozhat. make: `arch / i386 / kernel / asm-offsets.s" CHK include / asm-i386 / asm_offsets.h CC [M] /home/knz/j.kernel/3/hello-2.6.o Modulok építése, 2. szakasz. /usr/src/linux-2.6.3/ scripts / Makefile . modpost: 17: *** Óóó, elavult modulbejegyzéseid vannak.. Elrontottad a SUBDIRS-t, /usr/src/linux-2.6.3/scripts/Makefile.modpost:18: ne panaszkodj, ha valami elromlik.MODPOST CC /home/knz/j.kernel/3/hello-2.6.mod.o LD [M] /home/knz/j.kernel/3/hello-2.6.ko make: Ugrás innen: teki `/ usr / src / linux-2.6.3"

Az összeállítás végeredménye a kernelbe beilleszthető hello-2.6.ko modulfájl lesz.

Tisztelet, a 2.6-os kernelben a modulfájlok suffix.ko lehetnek, a 2.4-es kernelben nem.

Kernel szimbólum táblázat

Beszéltünk arról is, hogyan használhatjuk a kernel nyilvános szimbólumait tartalmazó insmod vikorist táblát, amikor a modult a kernellel kapcsoljuk össze. A táblázat a globális kernellétesítmények – funkciók és változások – címeit mutatja, amelyek a moduláris illesztőprogram-opciók megvalósításához szükségesek. A kernel nyilvános szimbólumtáblázata szöveges formában olvasható a / proc / ksyms fájlból, így a kernel beolvassa a / proc fájlrendszert.

A 2.6-os kernelben a / proc / ksyms fájl átnevezve a / proc / modules névre.

Amikor a modul zárolva van, a modul által exportált szimbólumok a kernel szimbólumtáblázatának részévé válnak, és a / proc / ksyms mappában nézheti meg.

Az új modulok testreszabott szimbólumokká válhatnak, amelyeket a modulja exportálhat. Így például az msdos modul a fat modul által exportált szimbólumokra támaszkodik, és a skin csatoló USB-t az usbcore és a bemeneti modulok vicorista szimbólumainak olvasási módjában fogják használni. Az ilyen összekapcsolás az utolsó hozzárendelt modulok után valósul meg, és modulhalmaznak nevezzük.

A modulok összecsukható projektjeinek megnyitásakor a modulok egy halma kézzel törlődnek. Egy ilyen absztrakciót az illesztőprogram kódja könnyen hozzákapcsolhat a hardveresen kimerült és a hardvertől független részekhez. Például a video for-linux illesztőprogramok készlete a fő modulból kerül tárolásra, amely szimbólumok exportálása az alacsony gyökerű illesztőprogramhoz, amely a győztes tulajdon sajátosságai. Üdvözöljük a konfigurációban, hozzá kell adni a fő videomodult és a hardverrészhez tartozó modult. Ugyanezt a rítust használják a párhuzamos portok és a csatlakoztatható csatolmányok széles osztályának megvalósítására, mint például az USB-csatlakozások. ábrán látható leolvasási porttal párhuzamos rendszerek halma. 2-2. A nyilak a modulok és a kernel szoftver interfész közötti interakciót mutatják. A Vzamodiya egyforma funkciókon és az adott kerovan függvények egyenlő struktúráin is működhet.

2-2 ábra. Párhuzamos port modul verem

Amikor felveszi a veremmodulokat, manuálisan használja a modprobe felhasználást. A modprobe segédprogram funkcionalitása némileg hasonlít az insmod segédprogramjához, de a modul zárolásakor a mögöttes betétek megfordulnak, és szükség esetén frissíteni kell a szükséges modulokat a modulverem szükséges tárolása előtt . Így egyetlen modprobe parancs akár több insmod parancsot is létrehozhat. Mondhatnánk, hogy a modprobe parancs egy intellektuális shell az insmod felett. Választhatja a modprobe-ot az insmod helyettesítésére mindenhol, a folyamkatalógusból a vypadkiv zavanazheniya vlastnyh modulok matricája mögött, így a modprobe csak a modulok terjesztésére szolgáló speciális katalógusokat nézi, de nem tudja kielégíteni a kimerülés mértékét.

A Podil modulok kiegészítő segítséggel változtatják a fejlesztési órát a feladatok meghatározásához. Az ár hasonló a podil árához a végrehajtási és kezelési politika mechanizmusával, amint azt az 1. szakaszban tárgyaljuk, „Bevezetés a meghajtó mellékleteibe”.

Nevezze el a modult, hogy a funkcionalitást a háttérben lévő szimbólumok exportálása nélkül valósítsa meg. A szimbólumok exportálása, amelyeket ugyanúgy ismer, mint ahogy megszabadulhat tőlük. Előfordulhat, hogy egy speciális direktívát kell beillesztenie a nem statikus szimbólumok exportálására, így a legtöbb használati modutils implementációban minden bűz exportálódik az umovchannym számára.

A Linux kernelfejlécek kényelmes módot biztosítanak a szimbólumok láthatóságának szabályozására oly módon, hogy megnehezítsék a kernelszimbólum-táblázatok használatát. A kernelekben található pratsyuє leírások mechanizmusa a 2.1.18-as verziótól javítva. A 2.0-s kernel kissé érzéketlen
szimbólumok, például leírások láthatósága a könyvben.

Mivel az Ön modulja nem hibás a háttérben lévő szimbólumok exportálásában, a modulfájlban kifejezetten méretezheti a támadó makrókattintást:

EXPORT_NO_SYMBOLS;

Van egy makrókattintás, amely a linux / module.h fájlban assembler direktívává bővül, és a modul bármely pontján értékek lehetnek. Ha azonban a kód be van kapcsolva, a fejlesztői kernelek hordozhatósága szükséges ahhoz, hogy a modul inicializálási függvényében (init_module) megváltoztassuk a makrókattintást, így ugyanannak a makróértéknek ugyanazt a verzióját énekeltük el a sysdep-ünkben. .h fájl a kernel régi verziójához.

Oldalról, ha a szimbólumok egy részét exportálnia kell a modulból, akkor a makró szimbólumot kell használnia
EXPORT_SYMTAB... Tsey macrosimvol buty értékekben vétkes elülső tartalmazza a module.h fejléceket. Otthonról átvett gyakorlatok є
a makró szimbólum értéke a praporon keresztül -D a Makefile-ban.

hogyan macrosimvol EXPORT_SYMTAB Jelezzük, hogy az egyes szimbólumok exportálhatók további makrók fogadásához:

EXPORT_SYMBOL (név); EXPORT_SYMBOL_NOVERS (név);

Legyen szó a tsikh két makrókról, hogy a szimbólum elérhető legyen a modulon kívül. A mező láthatósága abban, hogy a makró EXPORT_SYMBOL_NOVERS export szimbólum a verzióra vonatkozó információk nélkül (div. disztribúció 11 "kmod and Advanced Modularization"). További előadási információk elutasításáért
olvassa el a fejlécfájlt Egy gyakorlati győztesnek elég, ha győzni akarsz
makrók

Іnіcіalіzatsіya és modulok befejezése

Amint az már félreérthető, az init_module () függvény átstrukturálja a modul funkcionális összetevőit a kernelben. Egy ilyen rekonstrukciót a vicorist modul számára programok által írva lesz egy hozzáférési pont a modulba való belépéshez az interfészen keresztül, amelyet a kernel lát el.

A modulok funkció nélküli komponenseket állíthatnak vissza ezek szerepében, az újrastaging során a modul funkcióinak nevében megjelennek. A helyreállítás alapfunkciójában az indikátor átkerül a tribute szerkezetébe, az indikátor pedig a javasolt funkcionalitás megvalósításának funkciójába.

Az 1. szakaszban, "Bevezetés a mellékletek illesztőprogramjába" találták meg a fő melléklettípusok besorolását. Nem csak a kitalált mellékleteket regisztrálhatja ott, még ha azok is, egészen a szoftveres absztrakciókig, mint például a fájlrendszer / proc fájljai és az in. Minden, ami a kernelben a meghajtó szoftver interfészén keresztül elvégezhető, regisztrálható meghajtóként.

Ha többet szeretne megtudni a kernel alkalmazásában újratelepített illesztőprogramok típusairól, implementálhatja az EXPORT_SYMBOL szekvenciazajt a kernel jerelekben, és ismerheti a különböző illesztőprogramok által támogatott belépési pontokat. A vikoristák újraalapításának funkciójának szabályaként Regisztráció_,
ez a legjobb út! Regisztráció_ a / proc / ksyms fájlban a grep kiegészítő segédprogramhoz. Ahogy mondtam, a 2.6.x rendszermagban a / proc / ksyms fájl helyére / proc / modules kerül.

Bocsánat feldolgozása az init_module-ban

Amikor a telepítő éppen döntést hoz, legyen hibás, mielőtt a modul zupinkáját rábízzák. A sír például az adományok szerkezetének emelésekor bekövetkezett emlékezethiba révén a rendszerben található. Kár, csapdázni is lehet, és egy ilyen helyzetért a jó szoftverkód a hibás.

Mindent, amit az init_module () függvényben pardon kiadása előtt regisztráltak vagy frissítettek, el kell mondani, mert ez magától értetődő, mert a Linux kernelnek nem kell úgy tennie, hogy ne Ha nem láttad, mert nem látta a Viconan helyreállítást, akkor a kernel elveszik egy instabil malomban, és amikor a modult újrazárják
ha nem tudja megismételni a már visszaállított elemek visszaállítását, vagy nem tudja skasuvati a korábban visszaállított visszaállítást, mert az init_module () függvény új példányában nem lesz meg a regisztrált függvények helyes címe. A coli-szabványos rendszer frissítéséhez néhány kisebb összecsukható trükköt kell végrehajtani, és gyakrabban kell egyszerűen újratelepíteni a rendszert.

A rendszer számának megújításának megvalósítása a modul frissítése esetén, a frissítés rangját a goto operátor regisztrációjára csökkentjük. Hívja fel az egész operátort, hogy negatívan helyezzék a szélre, і, navіt, gyűlöletből, de az egész helyzet még durvábbnak fog tűnni. Ehhez a kernelben gyakran a goto operátort használják a modul inicializálási engedélyeinek feldolgozására.

Egy egyszerű, lépésről-lépésre kódoló, a re-strata és a її cassuvannya valós funkciói alapján bemutatja a kegyelmi feldolgozás ilyen módszerét.

Int init_module (void) (int err; / * a regisztráció egy mutatót és egy nevet vesz fel * / err = register_this (ptr1, "koponya"); if (err) goto fail_this; err = register_that (ptr2, "koponya"); if (err) goto fail_that; err = register_those (ptr3, "koponya"); if (err) goto fail_those; return 0; / * siker * / fail_those: unregister_that (ptr2, "skull"); fail_that: unregister_this (ptr1, " koponya "); fail_this: return err; / * a hiba terjesztése * /)

Számos alkalmazásnál tesztet végeznek a modul három komponensének helyreállítására. Az üzemeltető goto vikoristovuyutsya, amikor vyniknenna reestratsii és előállítani, mielőtt a helyreállította a zupinka zupinkeniya modul előtt a visszaállított alkatrészek.

Az alsó fenéknél a goto operátor érvényesítése nem gyorsítja fel a kód beolvasását є a modul sikeres működésének "memorizálásának" trükkje és a cleanup_module () prompt az információk információ formájában történő továbbítására. . A cleanup_module () függvényt úgy tervezték, hogy egy felszólítást jelenítsen meg, és automatikusan aktiválódjon egy modul meghívásakor. Az init_module () függvényben bekapcsolt érték hibás
hogy a modul kegyelmi kódja legyen. A Linux kernelben a kegyelmi kód negatív szám, amely nem ad hozzá értéket a fejlécekhez ... Adjon hozzá fejléceket a modulhoz, hogy szimbolikus emlékeztetőket biztosítson a fenntartott kegyelmi kódokhoz, például -ENODEV, -ENOMEM stb. Az ilyen mnemonikák Vikoristannya hozzászokott a jó programozási stílushoz. Figyelembe kell azonban venni, hogy a modutils csomagban található segédprogramok verziói helytelenül vannak elforgatva;
Általánosságban elmondható, hogy az init_modules () függvénnyel teljesen eltérő természetű kegyelmek csoportja forgatható. A qia csomag többi verziójában
a prikre a golyóhalmot kijavítják.

A cleanup_module () függvény kódja lebegő nézet esetén például a következő lehet:

Void cleanup_module (void) (unregister_those (ptr3, "skull"); unregister_that (ptr2, "skull"); unregister_this (ptr1, "skull"); return;)

Ha az inicializálási kód és a befejezés összehajtható, itt nincsenek leírások, akkor a goto utasítás fontossá tehető a szöveg olvasásához a programok által, így a befejezési kód az init_module () függvényben a goto utasításokból származó ismétlődésekből adódik. átmenetek nélkül Azért, hogy több trükköt vegyen fel, amikor az init_module () függvényből kiválasztja a cleanup_module () függvényt, hogy információt továbbítson a sikeres frissítésről, ha a modult törölték.

Az ilyen írott függvények init_module () és cleanup_module () gombja alább látható. Számos alkalmazásban vannak globálisan éneklő zuhanyozók, amelyek a sikeres innovációk cseréjéről hordoznak információkat.

Strukturál valamit * item1; valami mást szerkeszt * item2; int cucc_ok; void cleanup_module (void) (if (item1) release_thing (item1); if (item2) release_thing2 (elem2); if (stuff_ok) unregister_stuff (); return;) int init_module (void) (int err = -ENOMEM; item1 = allocate_thing (argumentumok); item2 = allocate_thing2 (arguments2); if (! item2 ||! item2) goto fail; err = register_stuff (elem1, item2); if (! err) cucc_ok = 1; else goto fail; return 0; / * siker * / sikertelen: cleanup_module (); return err;)

Függetlenül attól, hogy az Ön modulja inicializálása összecsukható, az itt található vezérlő módszerek egyikét használhatja a modul inicializálásának vezérlésére.

Csapda a modulhoz

A rendszer a skin modul záróelemének cseréjét hivatott biztosítani annak érdekében, hogy a modul biztonságos telepítésének lehetősége jelentős legyen. A rendszernek szüksége van információra, ezért a modul nem lehet élénk, mert nem hiába, mert nem látja a fájlrendszer meghajtót, mert nem tudja felcsatolni a fájlrendszert, mert nem tudja életre kelteni egy szimbolikus modul modulját. melléklet vikoristovuє tsei pristіy. Elsősorban,
rendszer összeomláshoz vezethet – szegmentációs hibához vagy kernelpánikhoz.

A legújabb magokban a rendszer egy automatikus ellenőrzőt adhat a vicoriste modul mechanizmusához, ami az offenzív disztribúcióban is látható. A kernel verziójától függetlenül manuálisan vezérelheti ezeket a fájlokat. Tehát a kernel régi verzióiban a vicorisovuvatiba átvitt kód hibás a vikoristovuvany modul vicorisovuvati modelljében a következő három makróban:

MOD_INC_USE_COUNT Zbіlshu folyadékhűtő victoriannya az áramlási modul MOD_DEC_USE_COUNT Zmenshu lichilnik vicoristannya az áramlási modul MOD_IN_USE Jobbra fordult, amint az adott modul zárja nullára ment

Makró értékek be , І bűzt egy speciális belső szerkezet manipulál, közvetlen hozzáférést biztosítva bármilyen elhanyagoláshoz. A jobb oldalon a belső struktúra és az adatok kezelésének módja változatról verzióra változhat, ekkor ugyanis a makrók hívott felülete láthatatlanná válik.

Tisztelet, nem kell változnod MOD_IN_USE a cleanup_module () függvény kódjában, így a rendszer automatikusan ellenőrzi az átalakítást a cleanup_module () wiki előtt a sys_delete_module () rendszerwikibe, ami a kernel / module.c értéke.

A modul vezérlőjének megfelelő vezérlése kritikus a rendszer stabilitása szempontjából. Ne feledje, hogy a mag bármikor automatikusan frissíthető. Gyakran van egy sír a mező programozható moduljaiban a görgő rossz vezérlése miatt. Például, ha a tápfeszültség be van kapcsolva, a modul kódja aktiválódik, amikor a feldolgozás befejeződött. Ez egy olyan programozó az átvitelre, amely értékek detektorát adja a modul viktoriánusának statisztikáinak gyűjtéséhez, akkoriban a javából valójában a modul áramló foglaltságának érzékelője, így több folyamat kitöltője a modul viktoriánus kódja. Ilyen rangban, amikor feldolgozásra kerül, a modulba kerül, guilty viclicati MOD_INC_USE_COUNT be-mint barkácsolás, i MOD_DEC_USE_COUNT pislya їkh vikonannya.

Bármilyen ésszerű okból előfordulhat, hogy ha nem tudja életre kelteni a modult, használhatja a kamera vezérlését a viktoriánuson. Ilyen helyzet gyakran előfordul a modul fejlesztésének szakaszaiban. Például a folyamat megszakadhat, amikor egy NULL indikátort próbál meg elnevezni, vagy nem tud életre kelteni egy ilyen modult, amíg az indikátort nem állítja nullára. Egy ilyen probléma megoldása a modul fejlesztésének szakaszában az MOD_INC_USE_COUNTі MOD_DEC_USE_COUNT az üres kódban. Jobb a bal oldali mezőt javítani ioctl () wiklik primusovo a viktoriánus modul kapcsolóját nullára dobta. Ezt láthatjuk az 5. szakasz „Továbbfejlesztett karakterillesztő-műveletek” „Az ioctl argumentum használata” részben. Nyilvánvalóan a sofőr viktoriánus készenlétében az ügyintéző álnok manipulálása történik, hogy buty, tiltakozzon, a jóság fokán a bűz megengedi, hogy megkímélje az eladó óráját, és hagyja elviselni. .

A skin modul rendszerfájljának stream értékét a / proc / modules fájl skin bejegyzésének harmadik mezőjében találja. Tsey fájl, hogy bosszút álljon a jelenleg zárolt modulokkal kapcsolatos információkért – skin modulonként egy sor. A sor első mezője a modul nevének bosszúja, a másik mező - a modul által a memóriában lévő kölcsönök nagysága, a harmadik mező - a vikoristannya pontos értéke. Qiu információ formázott nézetben,
az lsmod wiklik segédprogrammal szerkeszthető. A csikk alatt a / proc / modules fájlra mutat:

Parport_pc 7604 1 (autoclean) lp 4800 0 (nem használt) parport 8084 1 lockd 33256 1 (autoclean) sunrpc 56612 1 (autoclean) ds 6252 1 i82365 22304 1 41 cm280

Itt számos olyan modul van, amelyek belegabalyodnak a rendszerbe. A parcellák mezőjében (a sor maradék mezője) a négyzetes ívekben egy modulhalom látható. Ennek a közepe csatlakoztatható, ahol a porttal párhuzamos modulok a modulkötegen keresztül kommunikálnak, ahogy az ábra mutatja. 2-2. Az autoclean a kmod vagy kerneld kerovan modulokhoz használatos. Lásd a 11. fejezetet: "Kmod és speciális modularizálás"). A Prapor (unused) azt jelenti, hogy a modul egy adott pillanatban nem győztes. A 2.0-s magban a méretmező nem bájtokban jelenítette meg az információkat, hanem az oldalakon, a nagyobb platformok mérete 4KBt-ra volt beállítva.

a modul élénkítése

Egy másik vivant modulhoz használja az rmmod segédprogramot. A modul vivantálása egyszerűbb, mint az alsó tárolóhely vivantálása, amikor megjelenik, dinamikusan kapcsolódik a maghoz. Modul meghívásakor a rendszer wikelike delete_module () jelenik meg, amely a cleanup_module () függvény wikelike-ját fogja megjeleníteni, a modul ugyanúgy meghívásra kerül, ahogy a látogató nullát hoz a robotnak.

Mint már említettük, a cleanup_module () függvényben láthatja az inicializálási művelet megjelenítését, amikor a modult a cleanup_module () függvény zárolja. Ezenkívül a modul exportált szimbólumai automatikusan megjelennek.

A befejezés és a kezdeményezés kifejezett funkciója

Mint már említettük, amikor a modul zárolva van, a wiklick magja az init_module () függvény, és amikor a modul zárolva van, akkor a cleanup_module (). A kernel jelenlegi verzióiban azonban a függvénynek gyakran hiányzik a neve. A 2.3.23-as kernelből történő javítással lehetőség nyílt arra, hogy a modul zárolása és feloldása funkcióhoz kifejezetten nevet adjunk. Fertőzés, a cich függvényekhez kifejezetten hozzárendelt nevek is є a program stílusát ajánljuk.

Irányított popsi. Ha a modulunk inicializálási függvényét a my_init () függvénnyel, a végsőt pedig a my_cleanup () függvénnyel szeretné megnyitni, akkor mielőbb cserélje ki az init_module () és cleanup_module () függvényt, akkor két makrót kell beillesztenie.
fájl dzherel modul kódja):

Module_init (my_init); modul_exit (my_cleanup);

Tisztelettel, fejléceket fog tartalmazni a vikorystannya qih moduljában .

Ennek a sokszögstílusnak a sikere abban rejlik, hogy a magban lévő modulok inicializálásának és befejezésének skin funkciója a maga módján egyedi lehet, ami az alkalmazásban is hasznos. Sőt, ezeknek a függvényeknek a győzelme segít abban, hogy azonnal javítsa a javulást, mert a meghajtó kódját a modul megjelenítőjéből implementálja, vagy közvetlenül a kernelbe tud belépni. Úgy tűnik, a module_init és module_exit makróértékekre nincs szükség, mindaddig, amíg az inicializáláshoz és a befejezéshez használt függvények fenntartott nevekkel rendelkeznek, tehát az init_module () és a cleanup_module ().

Amint megismeri a 2.2-es vagy újabb verziójú kernelt, kissé módosíthatja az inicializálás és a befejezés funkciójához leírt formát. például:

Static int __init my_init (void) (....) static void __exit my_cleanup (void) (....)

Viktoriánus attribútum __benne az inicializálás befejezése előtt a függvény inicializálása a memóriából lesz kivéve. A folyamat azonban csak a kernelbe beillesztett illesztőprogramok esetében helyes, a modulok esetében figyelmen kívül hagyja. Továbbá a kernelbe telepített illesztőprogramok esetében az attribútum __kijáratÚgy tervezték, hogy figyelmen kívül hagyja az egész függvényt egy szimbolikus attribútummal. A warrant modulok esetében előrejelzések is lesznek.

Vikoristannya attribútumok __benne__initdata a tribute leírásához) megváltoztathatja a memória számát vikoristovuvana mag. zászlós jelvény __benne A modul funkciójának inicializálása nem hozott sem vigodit, sem shkodit. Az ily módon történő vezérlés még nem valósult meg a moduloknál, ha akarod, megteheted, a jövőre lebontják.

Pidvdennya pidsumkiv

Valamint a beküldött anyag eredményeként a „Hello world” modul alábbi verzióját tudjuk bemutatni:

A dzherel fájl modul kódja ============================================== #beleértve #beleértve #beleértve static int __init my_init_module (void) (EXPORT_NO_SYMBOLS; printk ("<1>Hello world \ n "); return 0;); static void __exit my_cleanup_module (void) (printk ("<1>Viszlát \ n ");); modul_init (my_init_module); module_exit (my_cleanup_module); MODULE_LICENSE (" GPL "); ======================== ====================== Makefile a modul összeállításához ========================= = ==================== CFLAGS = -Wall -D__KERNEL__ -DMODULE -I / lib / modules / $ (shell uname -r) / build / include hello.o : ================================================== ==============================

Hogy őszinte legyek, a Makefiles írásakor a GNU make hasznosságára törekedtek függetlenül attól, hogy egy objektumfájlt alakítottak ki egy változtatható CFLAGS és egy explicit fordító alapján a rendszerben.

Vikoristannya források

Egy modul nem tudja vizuálisan megjeleníteni működését rendszererőforrások, például memória, port bemenet/kimenet, memória bemenet/kimenet, átviteli vonalak és DMA csatornák regisztrálása nélkül.

Yak programozó, aki abban is bűnös, hogy tisztában van a keruvánok dinamikus memóriájával. Elképzeléseik alapelvei közül nem utolsósorban a dinamikus memória kezelése a magban. A program beállítható, hogy emlékezzen a vikorista funkcióra kmalloc ()і zvіlniti її, segítségért k ingyenes ()... Ezek a függvények még jobban hasonlítanak az ismert malloc () és free () függvényekhez, ugyanezen okból a kmalloc () függvénynek egy további argumentum kerül átadásra - a prioritás. Nevezze el a GFP_KERNEL vagy GFP_USER érték elfogadási prioritását. A GFP a "get free page" (ingyenes oldal) rövidítése – vegyen ingyenes oldalt. A mag dinamikus memóriakezelését a 7. „A memória megszerzése” című fejezet részletezi.

Bármely épületben van egy lista azokról a meghajtókról, amelyeknek kifejezett változtatásra van szükségük a bevezetés / vivo portjában, a bevezetés / vivo memóriájában és a vonalváltásban. Ugyanígy a kernelmodul könnyű hozzáférést biztosít az összes erőforráshoz. Szeretném, ha a rendszermemória naprakészen tudná hozni a hangot, a bemeneti/kimeneti memóriája, a port és a változássor kiemelt szerepet kapna és támogatná az alkalmazást. A fenékhez a meghajtónak kell egy port, mivel nincs
mindent, valamint azt, ami a kiegészítők kezeléséhez szükséges. Ale a sofőr nem vikoristovuvat az erőforrást, amíg csendes lakoma, mindaddig, amíg nem változik, de a bűz nem vikoristovuvat kimos shche.

A perifériás csatolmányok lokalizálására szolgáló memóriaterületet memória bemenetnek / kimenetnek nevezik, ebből a célból egyszerűen memóriának.

Porti és a bevezetés / szállítás emléke

A mobil meghajtó robotja már nagyon jól fel van szerelve az olvasási és írási portok és a bemeneti / kimeneti memória számára. Porti és emléke a bevezetés / vivedennya ob'єdnanі az idegen név - régió (vagy régió) beírt / vivodu.

Sajnos nem a gumiabroncs-architektúra bőrén lehet egyértelműen látni a bőrhosszabbítás bevezetésének/megvalósításának tartományát, és lehetőség van arra, hogy a vezető engedélyezze a megfelelő terület beállítását, vagy esetleg leírni az egyszerű olvasás/olvasás működését. Qia probléma különösen
menjen az ISA buszra, mivel egyszerű mellékletek személyi számítógépbe történő telepítésére is használható, és még az ipari világban is népszerű a PC / 104 megvalósításában (div. elosztott "PC / 104 és PC / 104 + " 15. fejezet).

Ha a busz a hardvermelléklet csatlakoztatására nem lenne vikoristovuvalasya, akkor a melléklet illesztőprogramja vétkes abban, hogy kizárólagos hozzáférést biztosít a bevezetési régiójához / vivedennya különféle illesztőprogramok telepítéséhez. Ha a modul, ha zvratayuchis amíg nem csatolja, hogy egy rekordot a mellékletben, akkor kaphat végzetes nyomait is.

A Linux gyártók bevezettek egy mechanizmust a bevezetési régiók tápellátására / létrehozására / a kolosszusok és melléképületek telepítésére vonatkozó előrendelés elkészítésére. Az egész mechanizmus már régóta győzedelmeskedik a bevezetett / vivod és a közelmúltban az erőforrás-gazdálkodási mechanizmushoz használt portoknál. Vegye figyelembe, hogy ez a mechanizmus egy absztrakciós program, és nem bővíti ki a hardver képességeit. Például az ugyanazon az eszközön bevitt / vivodu portokhoz való hozzáférés megtagadása nem wikklick, legyen az hasonló a "szegmentációs hibához", mivel a berendezés nem foglalkozik a videóval és az erőforrásainak engedélyezésével.

A regisztrált erőforrásokkal kapcsolatos információk szöveges formában érhetők el a / proc / ioports és / proc / iomem fájlokban. Az információk Linuxon jelennek meg, amely a 2.3-as kernelből javítható. Nagadaєmo, ez a könyv a 2.4-es kernelhez van rendelve, és a bonyolultság tiszteletben tartása a végleges kiadásban lesz bemutatva.

zsákmány

A következő jelenik meg típusként a / proc / ioports fájlban:

0000-001f: dma1 0020-003f: pic1 0040-005f: időzítő 0060-006f: billentyűzet 0080-008f: dma oldalreg 00a0-00bf: pic2 00c0-00bf: pic2 00c0-00dff : ide0 02f8-02ff: soros (készlet) 0300-031f: NE2000 0376-0376: ide1 03c0-03df: vga + 03f6-03f6: ide0 03f8-03ff: soros (készlet) 03f8-03ff. 1003: acpi 1004-1005: acpi 1008-100b: acpi 100c-100f: acpi 1100-110f: Intel Corporation 82371AB PIIX4 IDE 1300-131f: pcnet Corporation PPP0 kártya 2008-100 bc0 4PI 100b 124fc10 141fc10 - 1cff: PCI CardBus # 04 5800-581f: Intel Corporation 82371AB PIIX4 USB d000-dfff: PCI busz # 01 d000-d0ff: ATI Technologies Inc 3D Rage LT Pro AGP-133

Egy fájl skin sora tizenhat hüvelykes nézetben jelenik meg egy sor portról, amely egy illesztőprogramhoz vagy egy viper-melléklethez kapcsolódik. A kernel korai verzióiban a fájl ugyanabban a formátumban van, kivéve, hogy a port architektúra nem lett renderelve.

A fájl segítségével egységesíthető a portok száma, amikor új kiterjesztést adnak a rendszerhez. Különösen hasznos a jumper (jamper) kézi beállításánál. Sokféle ember számára könnyedén rácsodálkozhat a győztes portok listájára, és széles tartományban rezeghet egy kiegészítőért. Szeretnék olyan modernebb tartozékokat látni, amelyek nem veszik fel a kézi beállítást, így nem kevesebb, nem tűnik úgy, hogy más szürke alkatrészek előkészítésekor nem veszik fel.

Ez azonban még fontosabb, mivel az adatstruktúra a / proc / ioports fájlhoz van kötve, és szoftver elérési útján érhető el. Ehhez, ha a sofőr látképet csatol az információk bevezetéséhez, megtudhatja a bevezetés / gyártás portjainak választékát. Ez azt jelenti, hogy ha egy új melléképület vicceiben egy portot kell keresni, akkor a vezetőnek, hogy megszüntesse a rögzítési helyzetet a kikötőben, amelyet mások melléképületei foglaltak el.

Vidomo, scho szkennelt gumiabroncsok ISA є risikovannyu zavdannyam. Ehhez képest a hivatalos Linux kernellel kibővített illesztőprogram műveletei egyediek egy ilyen vizsgálatnál, amikor a modul le van zárva. Tim maga, a bűz egyedülálló rizikója a futó rendszer felvételéhez a kikötőben, győztes birtokukra. Szerencsére a gumiabroncsok jelenlegi architektúrájával nem könnyű kezelni a problémákat.

A szoftver interfész elérhető a bemenet/kimenet regisztrálásához, és a következő három funkcióban tárolódik:

Int check_region (unsigned long start, unsigned long len); struct erőforrás * request_region (unsigned long start, unsigned long len, char * name); void release_region (unsigned long start, unsigned long len);

funkció check_region () Beszerezhet egy wiklicant, amely megváltoztatja a portok adott tartományának foglaltságát. Vona megfordította a negatív kegyelmi kódot (például -EBUSY vagy -EINVAL) negatív üzenetekkel.

funkció kérés_régió () A tartományhoz rendelt cím kijelzése elforgatásra kerül, siker esetén nem nulla jelzés. A sofőrnek nem kell zberigatit vennie, vagy vicoristovuvati elfordítja a visszajelzőt. Minden, amit változtatni kell, módosítsa NULL-ra. A kód, amely csak 2.4-es kernelben hibás (egyébként), nem igényli a check_region () függvényt. nem kell ezen így gondolkodnom.
Lehetetlen a check_region () és request_region () függvények használata a wiklickek között. Ha meg akarja menteni a kernel régebbi verzióival kapcsolatos zűrzavart, a check_region () wikire van szükség a request_region () előtt.

funkció kiadás_régió () bűnös, hogy egy viclikan, aki korábban hangmeghajtóval rendelkezik, mint a győztes portok.

Az indikátor referenciaértékét a request_region () függvény elforgatja;

Három funkció működik, є .

A fenék a győzelmek után a viktoriánus aljára van hegyezve, így a kikötők helyreállításához ragad. A rögzítések feneke a vezető kezdeti koponyájának kódjával. (A skull_probe_hw () függvény kódja itt nem tájékoztató jellegű, ezért a hardveren tárolt kódot meg kell bosszulnia.)

#beleértve #beleértve static int skull_detect (unsigned int port, unsigned int range) (int err; if ((err = check_region (port, range))< 0) return err; /* busy */ if (skull_probe_hw(port,range) != 0) return -ENODEV; /* not found */ request_region(port,range,"skull"); /* "Can"t fail" */ return 0; }

Ebben az alkalmazásban a szükséges portok elérhetősége módosul. Ha a port nem elérhető, akkor nem lehet hozzáférni a berendezéshez.
A portolás meghatározása a mellékletben a szkennelés órájától adható meg. A request_region () függvény nem hibás ebben az alkalmazásban,
kudarccal végződnek. A kernel nem zárolhat egyszerre több modult, mert a győztes portok száma nem lehet
maє

Legyen szó a bevezetésről / vivodról, a sofőr felelős a felelősségért. A koponya-illesztőprogramunkat kirabolták a cleanup_module () függvényben:

Static void skull_release (unsigned int port, unsigned int range) (release_region (port, range);)

Az erőforrások ellátásának/előállításának mechanizmusa hasonló a modulok visszaállításának / regisztrációjának megszüntetésének mechanizmusához, és a fájlban leírt goto operátor győztes séma alapján valósul meg.

memória

A bemeneti / kimeneti memóriával kapcsolatos információk a / proc / iomem fájlon keresztül érhetők el. Az alábbiakban egy ilyen fájl tipikus része egy személyi számítógéphez:

00000000-0009fbff: System RAM 0009fc00-0009ffff: lefoglalt 000a0000-000bffff: Video RAM terület 000c0000-000c7fff: Videó ROM 000f0000-000fffff: Rendszer ROM 00100000-03feffff: System RAM 00100000-0022c557: Kernel kódot 0022c558-0024455f: Kernel adatok 20000000 2fffffff : Intel Corporation 440BX / ZX - 82443BX / ZX Host Bridge 68000000-68000fff: Texas Instruments PCI1225 68001000-68001fff: Texas Instruments PCI1225 (# 2) Bus0-ffe. ATI Technologies Inc 3D Rage LT Pro AGP-133 e6000000-e6000fff: ATI Technologies Inc 3D Rage LT Pro AGP-133 fffc0000-ffffffff: fenntartva

A tartomány címének értéke a tizenhatodik bejegyzésben látható. Dermális tartományra Ares indikációk yogo vlasnik.

A bevezetés / vivo memóriájához való hozzáférés visszaállítása hasonló a bevezetés / vivo portjainak visszaállításához, és a magban ugyanaz a mechanizmus készteti.

A beírt / vivo memóriacím szükséges tartományának megtagadása és engedélyezése érdekében az illesztőprogram hibás a vicoristovuvati ilyen wikliciben:

Int check_mem_region (unsigned long start, unsigned long len); int request_mem_region (előjel nélküli hosszú indítás, előjel nélküli hosszú len, char * név); int release_mem_region (unsigned long start, unsigned long len);

Hívja a vidomy tartomány illesztőprogramját a beírt memória címét / vivod, az adott erőforrás kódja módosítható, a portok tartományának gombjától függően:

If (check_mem_region (mem_addr, mem_size)) (printk ("illesztőprogramnév: memória már használatban van \ n"); return -EBUSY;) request_mem_region (mem_addr, mem_size, "drivername");

Rospodil erőforrások Linux 2.4-ben

A Linux 2.3.11-es kernelekben a buv bevezetések erőforrás-elosztásának szálfűzési mechanizmusa megakadályozza a rendszererőforrások kezeléséhez való unalmas hozzáférést. A dán szerelőt röviden leírják egy csomóban. Az alapvető erőforrás-eloszlás funkcióját azonban (mint például a request_region () és іn.) még implementálni kell a makrók nézetében, és azért, hogy elkerüljük a rendszermag korai verzióival való összetévesztést. A legtöbb gőznek nincs szüksége semmire a rozpodilu valódi mechanikájára vonatkozóan, de ez egy kicsit trükkös lehet, ha több összecsukható meghajtó van.

Az erőforrás-kezelő rendszert Linuxban, sok erőforrással, együgyűen valósítják meg. A rendszer globális erőforrásai (például portolás / vivodu) hozzáadhatók az aljára - például hozzáadhatók a hardverbusz bármely bővítőhelyéhez. Az éneklő driverek is, ha bazhannyak, logikai felépítésük alapján erőforrásokat adhatnak hozzá.

A vizuális erőforrások körét egy struct erőforrás-struktúra írja le, amely meg van mentesítve a címsoroktól :

Struktúra erőforrás (const char * név; előjel nélküli hosszú kezdet, vége; előjel nélküli hosszú zászlók; struct erőforrás * szülő, * testvér, * gyermek;);

Az erőforrások globális (gyökér) köre óránként bővül. Például az erőforrások szerkezete, amely leírja a bevezetés / vivo portját, a támadó rang:

Struktúra erőforrás ioport_resource = ("PCI IO", 0x0000, IO_SPACE_LIMIT, IORESOURCE_IO);

Itt található a PCI IO-val rendelkező erőforrás leírása, amely a nullától az IO_SPACE_LIMIT-ig terjedő címtartományt fedi le. A változás értéke a győztes platformok és esetleg a 0xFFFF (16 bites címtér, x86, IA-64, Alpha, M68k és MIPS architektúrákhoz), 0xFFFFFFFF (32 bites, SPARC térhez) 0xFFFFFFFFFFFFFFFF (64) -bit, SPARC64).

Az erőforrás-tartományok egy további allocate_resource () wiklikhez kapcsolhatók. Például a PCI busz innováció órája előtt a régió számára a busz címe egy új erőforrás, amely fizikai csatolásként van kijelölve. Ha a rendszermag kódja a PCI buszon fut a kijelölt portokon és memórián, akkor csak az összes régióhoz és disztribúcióhoz van új erőforrás a többi wikkicks ioport_resource () vagy iomem_resource () mögött.

Az illesztőprogram egyszerűen lekérheti egy bizonyos erőforrás egy részhalmazát (lízingelheti a globális erőforrás egy részét), és jelezheti, hogyan használható. Ha az erőforrás tárolva van, használja a request_region () wikit, amely a mutatót egy új struktúra-erőforrás-struktúrára változtatja, amely leírja az erőforrás ellátásának módját, vagy NULL-ra bocsátja kegyelem esetén. A Qia szerkezet a globális erőforrásfa része. Ahogy már beszélt, amikor az erőforrást elutasították, a vezető nem tudta a mutató értékét.

Az olvasó megtekintheti az erőforrás-kezelési diagram részleteit a kernel / resource.c fájlban, amely a kernel könyvtárába került. A győzelmek tudásának elérése érdekében azonban a jövőben még sokat kell fejlődni.

A gömb alakú mechanizmus erőforrásokat generált az erőforrások egy részhalmazának létrehozásához. Egyrészt tisztában vagyok az adott mag felépítésével. Még egyszer elcsavarom a / proc / ioports fájlt:

E800-e8ff: Adaptec AHA-2940U2 / W / 7890 e800-e8be: aic7xxx

Adaptec e800-e8ff termékcsalád A tartomány nagy része az aic7xxx illesztőprogram kérésével.

Az ilyen erőforrás-kezelés segítségével a címtér egy részhalmaza volt a tartományban, mivel ezek jelentik a birtoklás valódi összekapcsolódását. Az erőforrás-kezelő nem láthatja ugyanazt a címtartományt, de meg tudja javítani egy nem működő illesztőprogram telepítését.

Automatikus és kézi konfiguráció

A meghajtó által igényelt paraméterek a rendszerről a rendszerre változtathatók. Például az illesztőprogram vétkes a bemeneti/kimeneti címek és memóriatartományok nemességében. A jól szervezett busz interfészek esetében ez nem jelent problémát. Az egyikben azonban át kell adnia a paramétereket a meghajtónak, hogy segítsen neki megismerni a teljesítményt, vagy engedélyezni / elkeríteni a deyaky funkciót.

A Tsi-paraméterek, amelyeket a robot-meghajtóba fecskendeznek, a tartozékban fekszenek. Ez lehet például a melléklet által telepített verziószám. Nyilvánvalóan ezekre az információkra van szükség a vezető számára a megfelelő robothoz a tartozékokkal. Az ilyen paraméterek értéke (illesztőprogram konfigurációja) az, hogy elérje
ravaszul zavdannya, hogyan lehet győztes a vezető inicializálásánál.

Ugyanis ennek a paraméternek a helyes értékét kétféleképpen lehet elutasítani - vagy egyértelmű, vagy a birtoklási tapasztalatok alapján önállóan határozzák meg a járművezetőt. Azt akarom, hogy a csatolás automatikus felismerése őrült legyen;
Egy koristuvach esetében a konfiguráció könnyebben megvalósítható. Az illesztőprogram-kereskedő vétkes abban, hogy mindenhol felismerte az illesztőprogram automatikus konfigurálását, időnként, egyszerre, a vezető vétkes a kézi konfigurálás mechanizmusában. Nyilvánvaló, hogy manuálisan az anyának magasabb prioritása van az automatikus konfigurálásnál. A fejlesztési szakaszban kezdje el, és csak a paraméterek kézi átvitelét hajtsa végre a vezetőnek. Automatikus konfigurálás, ha lehetséges, adjon hozzá többet.

Driver's bagato, konfigurálható paraméterei között a paramétereket a vezető működési paraméterei változtatják. Például az interfész IDE-illesztőprogramjai (Integrated Device Electronics) lehetővé teszik a DMA-műveletek vezérlését. Tehát, ha az illesztőprogramod jó, akkor lehetséges a birtoklás automatikus felismerése, ha ellenőrizni szeretnéd a meghajtó működését.

A paraméterek értékeit a modul blokkolása során az insmod vagy modprobe paranccsal lehet átadni. Az óra további részében lehetőség nyílt a paraméterek értékeinek kiolvasására a konfigurációs fájlból (link /etc/modules.conf). A Yak paraméterek egész és karakterlánc értékben adhatók át. Így, ha módosítani kell a skull_ival paraméter értékét és a skull_sval paraméter karakterlánc értékét, akkor elküldheti a modul utolsó óráját az insmod parancs további paramétereivel:

Insmod skull skull_ival = 666 skull_sval = "a fenevad"

Az első insmod parancs azonban módosíthatja a modul paramétereinek értékeit, a modul felelős a paraméterek elérhetővé tételéért. A paraméterek megvonásra kerülnek a MODULE_PARM további makroértéktől, amint azt a module.h fejlécekben jelezzük. A MODULE_PARM makró két paramétert fogad el: іm'ya change і row, amely az első típus. Tekintettel a makroértékekre, a függvények határai mögé helyezték el, és felkéri őket, hogy növekedjenek egy fájlba a változtatások írásához. Tehát van két kitalált paraméter, amelyeket a következő módon lehet denudálni:

Int koponya_ival = 0; char * koponya_sval; MODULE_PARM (koponya_ival, "i"); MODULE_PARM (skull_sval, "s");

Jelenleg ötféle modulparaméter áll rendelkezésre:

  • b - egybájtos érték;
  • h - (rövid) kétbájtos érték;
  • i - az egész;
  • l - dovge tsіle;
  • s - sor (char *);

Egyes karakterlánc-paramétereknél a modulokban a jelző (char *) felmondást okoz. Az insmod parancs memóriát generál az átvitt sorokhoz és a szükséges értékekhez. A MODULE_PARM további makróhoz paraméterek tömbjét formázhatja. Általában az egész szám, amely a betűtípusba kerül, egy dovzhin massv. Ha két egész számot kötőjellel adunk meg, a bűz az átvitt értékek legkisebb és maximális száma. Az adott makroértékek részletesebb robotintelligenciájához térjen vissza a fájlfejlécekhez .

Például ne legyen paramétertömbje a jövőben, de legalább kettő, és legalább egy choter több értékkel. A Todi vin a következő sorrendben írható le:

Int koponya_tömb; MODULE_PARM (koponya_tömb, "2-4i");

Ezen kívül a programozó eszköztárában található egy MODULE_PARM_DESC makróérték, amely lehetővé teszi a megjegyzések közzétételét a modul paramétereinek átvitele előtt. Néhány megjegyzés a modul objektumfájljába kerül, és további segítséget kereshet, például az objdump segédprogramokat, vagy további automatizált eszközöket a rendszer adminisztrációjához. Rámutatva, az adott makroérték feneke:

Int alap_port = 0x300; MODULE_PARM (alapport, "i"); MODULE_PARM_DESC (alapport, "Az alap I/O port (alapértelmezett 0x300)");

Bazhano, a modul összes paraméterének kevés értéke van a változtatásokhoz. A Zmіna qih értéke az insmod segítségért csak minden fogyasztó számára használható. A modul felülírható a paraméterek explicit definiálásával úgy, hogy az aktuális értékeket felülírja a helyettesítések értékeivel. Ezután egy ilyen séma alapján megvalósíthatja az automatikus konfigurálás mechanizmusát. Ha a paraméterek értéke lehet az opciók értéke, akkor az Autoconfiguration jelenik meg. A іnshomu vypadku - vikoristoyutsya jelenlegi értékeket. Az eljárási séma megadásához szükséges, hogy a javaslatok értékei ne jelezzék a rendszer lehetséges valós változásait. A Todi engedélyezhető, de ezt a jelentést a felhasználó nem telepítheti kézi konfigurációval.

A támadó fenék megmutatja, hogyan fogja a koponya viroblya illesztőprogram automatikusan felismerni a csatolandó portok címterét. Az irányított csatolásnál az automatikus kijelöléseknél a védőszemüveg az üres mellékleteket nézheti majd, abban az órában manuális konfigurálással a meghajtó egy melléklettel van összekötve. A skull_detect függvényt korábban is bemutattuk a bevezetés / vivo portokat leíró részben. A skull_init_board () függvény megvalósítása nem jelenik meg, így a yak nyert
elvégzésére berendezések-ugar іnіtsіalіzatsіyu.

/ * * Porttartományok: az eszköz * 0x280 és 0x300 között lehet, 0x10-es lépésekben. 0x10 portot használ. * / #Define SKULL_PORT_FLOOR 0x280 #define SKULL_PORT_CEIL 0x300 #define SKULL_PORT_RANGE 0x010 / * * a következő függvény automatikus felismerést hajt végre, kivéve, ha az insmod adott * értéket a "skull_port_base" =skull_port_base = inbat skull-hoz *_0portic; / * 0 automatikus felismerést kényszerít * / MODULE_PARM (koponyaport_alap, "i"); MODULE_PARM_DESC (skull_port_base, "Alap I/O port a koponyához"); static int skull_find_hw (void) / * az eszközök számát adja vissza * / (/ * base vagy a betöltési idő értéke, vagy az első próba * / int base = skull_port_base? skull_port_base: SKULL_PORT_FLOOR; int eredmény = 0; / * loop one time if érték van hozzárendelve; próbálja ki mindegyiket ha autodetecting * / do (if (skull_detect (base, SKULL_PORT_RANGE) == 0) (skull_init_board (base); eredmény ++;) base + = SKULL_PORT_RANGE; / * felkészülés a következő próbaverzióra * / ) while (skull_port_base == 0 && alap< SKULL_PORT_CEIL); return result; }

Mivel a konfigurációs változtatások csak az illesztőprogram közepén érhetők el (mivel a kernel szimbólumtáblázatában nem szerepel), a programozó egyszerűen leegyszerűsítheti a meghajtó életét, nem pedig a koponyánk közepén lévő gonosz preferenciára. A koristuvach esetében a ts előtagok trochokat jelentenek, és a їх láthatóság parancskészletet kér a billentyűzetről.

A további leírások kedvéért három olyan makróérték leírását adjuk meg, amelyek lehetővé teszik az objektumfájl megjegyzéseinek tartalmának módosítását.

MODULE_AUTHOR (név) Felsorolja a sort a szerző nevétől az objektumfájlban. MODULE_DESCRIPTION (leírás) A sor a kezdeti leírástól az objektumfájl moduljáig bővül. MODULE_SUPPORTED_DEVICE (fejlesztő) Bővítem a sort, a modul által hozzáadott kiegészítő modul leírásával. A Linuxnak van egy fárasztó és nagyszerű API-ja, de csak egy hiányzik. Egy kernel-illesztőprogram szükséges a rendszerben lévő kiemelt információk birtoklásával és hozzáférésével való együttműködéshez.

A Linux kernel modul egy bináris kód fordítására szolgáló folyamat, amely közvetlenül a Linux kernelbe illeszthető be, közvetlenül a 0-s körbe, és az x86-64 processzorban megjelenik a parancsok belső és leginkább ellopott gyűrűje. Itt a kódot a rendszer minden változtatás nélkül másolja, csak a rendszer nevére és a rendszer bármely erőforrásához való hozzáférésre.

A chi nem egyszerű halandóknak való

A Linux kernel modulok írása gyenge idegzetű emberek számára nem elfoglalt. Zmіnyuchi a mag, lásd rizikuєte vratiti danі. A kernelkód nem ugyanazt a szabványos kódot tartalmazza, mint a legújabb Linux-kiegészítőkben. Ha bocsánatot kér, tegye le az egész rendszert.

A helyzetet túlnyomja, hogy a probléma nem feltétlenül jelentkezik egyszerre. Ha a modul zárolás után azonnal a rendszerben van, akkor ez a legszebb forgatókönyv. Chim több van egy kód, ez nagyobb kockázatot a végtelen ciklusok és fordulatok a memória. Ha nem törődik vele, akkor a probléma lépésről lépésre felhalmozódik a robotgépek világában. Az adott puffer fontos szerkezete és a puffer átírása felülírható.

A dokumentumfejlesztés hagyományos paradigmáinak fő feledésében lehetséges. Amíg a modul telepítve van és frissítve van, akkor azt a kódot kell írni, amely a rendszerdobozokra válaszol, és nem az utolsó sablon szerinti kódot. A maggal rendelkező robotoknál az API-t kell írni, nem magukat a kiegészítőket.

A szabványos könyvtárhoz sem férhet hozzá. Ha a kernel valami printk függvényt (a printf helyettesítésére) és a kmalloc-ot (hasonlóan a malloc-hoz) akar csinálni, akkor alapvetően csak egy zaliz marad. Előtte, a modul életre keltése után, magam után kell kitakarítanom. Nincs smittya gyűjtemény.

szükséges alkatrészeket

Mindenekelőtt áttérek a robotokhoz szükséges összes eszköz nyilvánvalóságára. Naygolovnishhe, Linuxos gép szükséges. Tudom, az ár nem megfelelő! Ha Linux disztribúció akarsz lenni, akkor minden alkalmazásban van egy ördögi Ubuntu 16.04 LTS, így más disztribúciók fejlesztése során könnyedén módosíthatod a telepítési parancsokat.

Más szóval, fizikai gépre vagy virtuális gépre van szükség. Különösen azt vvazhayu gyönyörűen stílusos virtuális gépeken, kérjük, válassza ki magát. Rajah nem vikoristovuvati a fő autó elvesztése révén tribute, ha bocsánatot. Úgy tűnik, hogy "ha", és nem "tetszik", akkor szeretném átvinni az autót a folyamaton. A kód fennmaradó módosításai még mindig megtalálhatók az írási pufferben a kernelpánik idején, így az üzenetek feldolgozhatók. Tesztelés virtuális gépeken

Először is, ha valami nemes C-t akarsz. A robusztus C ++ középút túl nagy a kernelhez, ezért tiszta csupasz C-re kell írni. A birtokokkal való interakcióhoz ne ismerd meg az assembler tudását. .

A konnektor közepének felszerelése

Ubuntun a következőket kell futtatnia:

Apt-get install build-essential linux-headers-`uname -r`
Telepítse az ehhez az állományhoz szükséges rendelkezésre álló eszközöket és kernelfejléceket.

Tedd rá a juttatás alját, így a zvychay koristuvach z-pidjét dicséred, és nem a gyökért, hanem több sudo jogosultságod van. A kernelmodulok zárolásához a Sudo szükséges, de szeretném kipróbálni, amennyire csak lehetséges a gyökéren kívül.

javítani

Folytassa a kód írásával. Pidgotuєmo középünk:

Mkdir ~ / src / lkm_example cd ~ / src / lkm_example
Indítsa el a szerelemszerkesztőt (a vim-emben), és nyissa meg az lkm_example.c fájlt a következőképpen:

#beleértve #beleértve #beleértve MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("Robert W. Oliver II"); MODULE_DESCRIPTION ("Egy egyszerű példa Linux modulra."); MODULE_VERSION ("0.01"); static int __init lkm_example_init (void) (printk (KERN_INFO "Hello, World! \ n"); return 0;) static void __exit lkm_example_exit (void) (printk (KERN_INFO "Viszlát, világ! \ n"); ); modul_exit (lkm_example_exit);
Megterveztük a legegyszerűbb és legrugalmasabb modult, amelyet a következő részben lehet bemutatni:

  • Az include újravédett fejlécfájlokat tartalmaz, amelyek a Linux kernel terjesztéséhez szükségesek.
  • A MODULE_LICENSE oldalon a modul licencétől eltérő értéket állíthat be. A lista újbóli megtekintéséhez futtassa:

    Grep "MODULE_LICENSE" -B 27 / usr / src / linux-headers-`uname -r` / include / linux / module.h

  • Az init és exit statikus függvényeket állítjuk be, amelyek egész számokat forgatnak.
  • A viktoriánus printk fenevad tisztelete a printf helyett. A printk paraméterek is printf néven jelennek meg. Például a Prapor KERN_INFO egy adott sor naplózási prioritásának felmondását a komi nélkül kell alkalmazni. A kernel több beszéddel rendeződik a középső printk függvényben a veremmemória megtakarítása érdekében.
  • A fájlban bejelölheti a module_init és a module_exit paramétereket, és engedélyezheti a következmény és számlázás funkciót. Mindez számos funkció erejét biztosítja.
A fájlt azonban még nem tudjuk lefordítani. Makefile szükséges. Egy ilyen alapkészletből van elég. Beastly tisztelet, így még vibaglivy tisztásokra és tabam, így újra összefűzni, hogyan vicorista tabi cserélje ki a probes de nibble.

Obj-m + = lkm_example.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
Amint a make elindul, ez a sikeresen lefordított modul hibája. Az eredményül kapott fájl lkm_example.ko lesz. Amint úgy néz ki, mint a bocsánat, fordítsa meg őket, hogy a kimeneti kódban a mancsok helyesen legyenek beállítva, és ne homályosan az UTF-8 kódban.

Most már használhatja a modult és konvertálhatja azt. A mo futtatásához:

Sudo insmod lkm_example.ko
Ha minden rendben van, akkor nem fogsz legyőzni semmit. A printk függvény nem a konzolba írja a kimenetet, hanem a kernelnaplóba. A betekintéshez futnia kell:

Sudo dmesg
Bűnös vagy, hogy befoltoztad a "Hello, World!" sort. egy mіtkoy órával a csutkán. Ez azt jelenti, hogy a kernelmodulunkat zároltuk, és sikeresen bejegyeztük a kernelnaplóba. Azt is megváltoztathatjuk, hogy a modul hogyan legyen a memóriában:

Lsmod | grep "lkm_example"
Az indító megnyitásához:

Sudo rmmod lkm_example
Amint tudom, hogy futtassam a dmesg-t, majd tedd közzé a "Viszlát, világ!" Újra futtathatja az lsmod-ot, és megváltoztathatja, így a modul élénk lesz.

Yak bachite, a trocha tesztelésének eljárása automatikus lesz, az eljárást automatizálhatja a következő hozzáadásával:

Teszt: sudo dmesg -C sudo insmod lkm_example.ko sudo rmmod lkm_example.ko dmesg
a Makefile-ban, majd futtassa:

Csinálj tesztet
a modul tesztelésére és a nézetek kernelnaplóba konvertálására anélkül, hogy a parancsot le kellene futtatni.

Most van egy funkcionálisabb és teljesen triviális kernel modulunk!

Ássunk egy trochie glibshe-t. Ha szeretné az épület magjának moduljait, az épületek összes nézetét, a kiegészítőkkel való interakció az egyik legnépszerűbb telepítési lehetőség.

Oskіlki dodatki zabonono, hogy újra megnézze a memóriát a kernel hatalmas tárházában, és a velük való interakcióhoz megjelenik az API. Ha technikailag akarom, vannak módok az ilyen interakcióra, a legjobb módja a fájl csatolása a fájlhoz.

Ymovirno, korábban és több, látom a csatolt fájlokat. Parancsok a / dev / zero, / dev / null és hasonló kiegészítésekhez a "nulla" és "null" kiterjesztéshez, amelyek elforgatják az értékeket.

Alkalmazásunk egy "Hello, World" felirattal rendelkezik. Ha a funkció nem még rosszabb a kiegészítők esetében, akkor egy dolog bemutatja a kiegészítőkkel való interakció folyamatát egy csatolmányfájlon keresztül.

Tengely újralista:

#beleértve #beleértve #beleértve #beleértve #beleértve MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("Robert W. Oliver II"); MODULE_DESCRIPTION ("Egy egyszerű példa Linux modulra."); MODULE_VERSION ("0.01"); #define DEVICE_NAME "lkm_example" #define EXAMPLE_MSG "Helló, világ! \ n" #define MSG_BUFFER_LEN 15 / * Eszközfunkciók prototípusai * / static int device_open (struct inode *, struct fájl *); static int device_release (struct inode *, struct file *); static ssize_t device_read (struct file *, char *, size_t, loff_t *); static ssize_t device_write (struct file *, const char *, size_t, loff_t *); static int fő_szám; static int eszköz_nyitott_száma = 0; static char msg_buffer; static char * msg_ptr; / * Ez a struktúra az összes eszközfunkcióra mutat * / static struct file_operations file_ops = (.read = device_read, .write = device_write, .open = device_open, .release = device_release); / * Amikor egy folyamat beolvas az eszközünkről, ez meghívásra kerül. * / Statikus ssize_t device_read (struct fájl * flip, char * puffer, size_t len, loff_t * offset) (int bytes_read = 0; / * Ha a végén vagyunk, akkor vissza az elejére * / if (* msg_ptr = = 0) (msg_ptr = msg_buffer;) / * Adatok elhelyezése a pufferben * / while (len && * msg_ptr) (/ * A puffer a felhasználói adatokban van, nem a kernelben, így nem lehet csak a *-ra hivatkozni egy mutatóval. A függvény put_user kezeli ezt helyettünk * / put_user (* (msg_ptr ++), buffer ++); len--; bytes_read ++;) return bytes_read;) / * Akkor hívják meg, ha egy folyamat írni próbál az eszközünkre * / static ssize_t device_write (struct file * flip, const char * puffer, size_t len, loff_t * offset) (/ * Ez egy csak olvasható eszköz * / printk (KERN_ALERT "Ez a művelet nem támogatott. \ n"); return -EINVAL; ) / * Akkor hívódik meg, amikor egy folyamat megnyitja az eszközünket * / static int device_open (struct inode * inode, struct file * file) (/ * Ha az eszköz nyitva van, akkor return busy * / if (device_open_count) (return -EBUSY;) device_open_count + +; try_module_get (EZ _MODULE);< 0) { printk(KERN_ALERT “Could not register device: %d\n”, major_num); return major_num; } else { printk(KERN_INFO “lkm_example module loaded with device major number %d\n”, major_num); return 0; } } static void __exit lkm_example_exit(void) { /* Remember - we have to clean up after ourselves. Unregister the character device. */ unregister_chrdev(major_num, DEVICE_NAME); printk(KERN_INFO “Goodbye, World!\n”); } /* Register module functions */ module_init(lkm_example_init); module_exit(lkm_example_exit);

Polírozott csikk teszt

Most már jobban kirabolható a fenekünk, nem csak a zár és a zár esetében van változás, így a vizsgálati procedúra kevesebb, mint egy suvor. A Makefile csak a modul bekötésére módosul, yogo vivantage nélkül.

Obj-m + = lkm_example.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 teszt: # Az rmmod parancs elé teszünk egy - jelet, hogy figyelmen kívül hagyja # a hibát, ha a modul nincs betöltve. -sudo rmmod lkm_example # Kernelnapló törlése echo nélkül sudo dmesg -C # A modul beszúrása sudo insmod lkm_example.ko # A kernelnapló dmesg megjelenítése
Most a make test futtatásakor módosítsa a melléklet fő számának megjelenését. Automatikusan hozzárendelünk egy kernelt az alkalmazásunkhoz. A szám azonban szükséges az új melléklet megnyitásához.

Vegyünk egy számot, változtassuk meg a make teszt eredményeként, és válasszuk ki a fájl melléklethez, hogy egy koristuvach nyílt teréből tudjunk kapcsolatot létesíteni kernelmodulunkkal.

Sudo mknod / dev / lkm_example MAJOR 0-val
(Általában cserélje ki a MAJOR-t az értékekkel, ezt a make teszt vagy a dmesg eredményében tagadjuk)

Az mknod parancs c paramétere utasítja az mknod-ot, hogy nyissa meg a szimbolikus mellékletfájlt.

Most már javíthatjuk a melléklet helyett:

Cat / dev / lkm_example
Vagy navigáljon a dd parancsban:

Dd if = / dev / lkm_example of = teszt bs = 14 count = 100
A fájlhoz való hozzáférést az adatfájlokból is szerkesztheti. Nem szükséges további összetevőket fordítani - navigáljon a Python, Ruby és PHP szkriptekből є hozzáférés az adatokhoz.

Ha befejeztük a kiegészítőt, láttam a yo és vivantage modulomat:

Sudo rm / dev / lkm_example sudo rmmod lkm_example

visnovok

Hálás vagyok, megtisztelnek üres helyeinkkel a mag hatalmasságában. Ha primitív csikkeket akarunk mutatni, akkor a tápmodulok szárához olyan szerkezetek használhatók, hogy a szerkezet még jobban összehajtható legyen.

Ne feledd, hogy a mag nyílt terében minden a te perspektívádat szolgálja. Ott a kódodhoz nincs szükség újabb esélyre. Ha egy ügyfél projektjén dolgozik, tervezze meg előre a benyújtást, ellenkező esetben egy órát vesz igénybe a javítás. A rendszermag kódja a hibás, hogy ideális, amennyire csak lehetséges, hogy garantálja azon rendszerek integritását és megbízhatóságát, amelyeken fut.

Készüljön fel a projektre – köszönjük szépen!
Olvassa el is
Sberbank (ugyanabban az Oschadbankban) Sberbank (ugyanabban az Oschadbankban) Az Autocad Chi licencproblémáinak megoldása nem indítja el az Autocad Windows 7 rendszert Az Autocad Chi licencproblémáinak megoldása nem indítja el az Autocad Windows 7 rendszert Útmutató a CryptoPro PIN kódjának regisztrálásához, bizonyos dokumentumok regisztrációjának órája előtt - Útmutató - AT Útmutató a CryptoPro PIN kódjának regisztrálásához, néhány dokumentum regisztrációjának órája előtt - Útmutató - AT "PEK-Torg"