Pro správu a snížení této složitosti organizují vývojáři softwaru kód do malých souborů, které odkazují na konkrétní moduly. Vývojáři mohou každý z těchto souborů zkompilovat samostatně a poté je propojit a vytvořit finální spustitelný software.
Příkladem toho jsou projekty C vytvořené ze souborů zdrojového kódu v .c rozšíření a softwarová rozhraní ve Windows .h rozšíření. Každý zdrojový soubor se zkompiluje společně se soubory záhlaví, které se mají vytvořit. o objekty propojené pomocí knihoven, čímž vytvářejí spustitelné soubory.
K provedení tohoto procesu používají vývojáři softwaru nástroje, jako je Make, k automatizaci procesu sestavení a požadovaných závislostí souborů. Make používá Makefiles ke správě chování procesu kompilace.
Nástroje GNU Make poskytují sadu pravidel a konvencí používaných k vytváření souborů Makefiles a snižují složitost při zlepšování efektivity.
V tomto kurzu se budeme konkrétně zabývat Makefiles jádra Linuxu Kconfig a Kbuild.
Než začneme, je dobré si uvědomit, že tento článek nepředstírá, že učí vše o systému Kernel Build. Poskytujeme však přehled na vysoké úrovni o vytváření obrazu a modulů vmlinux.
Pokud chcete informace nad rámec tohoto tutoriálu, doporučujeme vám následující zdroj, který vám poskytne lepší informace:
https: // linkfy.do / goMakefilesDocs
https: // linkfy.do / gnuMake
Kernel Makefiles: Přehled
Systém sestavení jádra, nazývaný také konfigurační systém, je základním nástrojem pro ty, kteří jej potřebují, který už nějakou dobu existuje. Ne každý však bude tento systém používat; dokonce i řidiči a další vývojáři softwaru na nízké úrovni jej používají zřídka. Protože to čtete, znamená to, že se chcete dozvědět více o systému sestavení jádra.
Budeme tedy diskutovat o tom, jak se jádro kompiluje, a probereme systém Kbuild a Kconfig, abyste jim lépe porozuměli.
Kernel Makefile má pět základních komponent:
- Makefile: Toto je soubor nejvyšší značky umístěný ve zdrojovém kořenovém adresáři.
- arch / $ (ARCH) Makefile: Toto je arch Makefile; funguje jako doplněk k nejvyššímu Makefile.
- .konfigurace: Toto je konfigurační soubor jádra.
- Skripty / Makefile.*: Toto definuje nastavená pravidla pro všechny Makebuildy kbuild.
- Kbuild Makefiles: Existuje asi 500 Makebuild souborů Kbuild a není snadné je číst. Zvažte soubor, jako například:
https: // elixír.bootlin.com / linux / latest / source / scripts / Kbuild.zahrnout
Kconfig
Soubor Kconfig obsahuje moduly, které pomáhají při používání make * config. Pomáhá jádru provádět selektivní konfigurace, vytváří modularitu a přizpůsobitelnost procesu sestavování jádra.
Systém Kconfig určuje různé cíle konfigurace. K zobrazení dostupných cílů můžete použít nápovědu značky. Tyto cíle jsou zpracovávány různými programy poskytovanými jádrem během procesu sestavování.
Mezi cíle Kconfig patří:
- Konfigurace: Slouží k aktualizaci konfiguračního souboru jádra pomocí linkového programu.
- Konfigurace nabídky: Toto je funkce nebo mechanismus Kconfig, který nabízí přístup k možnostem jádra v nabídce. Chcete-li spustit menuconfig a další funkce Kconfig, měli byste být v adresáři projektu platformy. Ke spuštění funkce Kconfig menuconfig můžete použít následující. Můžete však také spustit menuconfig s dalšími funkcemi konfigurace jádra Linuxu, jako je xconfig a gconfig. udělat linux-windriver.menuconfig - Provede menuconfig v samostatné relaci terminálu.
- gconfig a xconfig: Gconfig aktivuje funkce linuxového jádra založené na GUI. Gconfig využívá uživatelské rozhraní založené na GTK nebo (na základě X). Na druhou stranu Xconfig využívá uživatelské rozhraní založené na Qt. Ke spuštění gconfig a xconfig použijte následující příkazy:
udělat linux-windriver.xconfig
POZNÁMKA: Chcete-li používat gconfig a xconfig, měli byste mít v hostitelském systému nainstalované vývojové nástroje QT.
- Nconfig: Funkce Nconfig spouští aktuální konfiguraci (Buildtools) a platí pro program řízený pomocí nabídky Ncurses. Díky tomu můžete při sestavování jádra vybrat balíčky, které se mají sestavit, například CPU, ovladače a souborový systém. Použijte příkaz: make nconfig.
- Oldconfig: Funkce oldconfig umožňuje použít novější .konfigurační soubory na starší konfigurační soubory jádra. Například starý .konfigurační soubor a novější .konfigurační soubor (novější verze jádra) bude mít rozdíly, což znamená, že musíte před sestavením jádra aktualizovat aktuální konfiguraci. Můžete použít make oldconfig k interaktivní aktualizaci staré konfigurace použitím možností, které ve starém konfiguračním souboru chybí.
- Defconfig: Tato funkce umožňuje systému sestavení jádra přidat novou konfiguraci dodávanou programem defconfig do systému .konfigurační soubor. Přesněji řečeno, systém Kbuild kontroluje všechny soubory Kconfig. Pokud defconfig určuje možnost v souboru, systém Kbuild použije zadanou hodnotu k přidání možnosti do .konfigurace. Pokud defconfig nezmiňuje tuto možnost, použije Kbuild výchozí hodnoty v .konfigurace.
Zvažte následující:
Snímek kódu defconfig z následujícího zdroje:
https: // elixír.bootlin.com / linux / v5.9 / zdroj / skripty / kconfig / Makefile # L98
1. defconfig: $ (obj) / conf2. ifneq ($ (zástupný znak $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Výchozí konfigurace je založena na '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. jiný
6. @ $ (kecho) "*** Výchozí konfigurace je založena na cíli '$ (KBUILD_DEFCONFIG)'"
7. $ (Q) $ (VYDĚLAT) -f $ (srctree) / Makefile $ (KBUILD_DEFCONFIG)
8. endif
9.
10. % _defconfig: $ (obj) / conf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configfiles = $ (zástupný znak $ (srctree) / jádro / configs / $ @ $ (srctree) / arch / $ (SRCARCH) / configs / $ @)
14.
15. %.config: $ (obj) / conf
16. $ (if $ (call configfiles) ,, $ (chyba U tohoto cíle na této architektuře neexistuje žádná konfigurace)))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / skripty / kconfig / merge_config.sh-m .config $ (konfigurační soubory)
18. $ (Q) $ (VYDĚLAT) -f $ (srctree) / Makefile olddefconfig
Snímek kódu Oldconfig z následujícího zdroje:
https: // elixír.bootlin.com / linux / v5.9 / zdroj / skripty / kconfig / konf.c # L694
1. případ olddefconfig:2. výchozí:
3. přestávka;
4.
5.
6. if (input_mode == savedefconfig)
7. if (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Chyba při ukládání defconfig na:% s \ n \ n",
9. defconfig_file);
10. návrat 1;
11.
12. else if (input_mode != listnewconfig && input_mode != helpnewconfig)
13. pokud (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Chyba při zápisu konfigurace.\ n \ n ");
15. výstup (1);
16.
17.
18. / *
19. * Vytvořit auto.conf, pokud neexistuje.
20. * Tím se zabrání GNU Make 4.1 nebo starší z vyzařování
21. * "zahrnout / config / auto.conf: Žádný takový soubor nebo adresář "
22. * v Makefile nejvyšší úrovně
23. *
24. * syncconfig vždy automaticky vytváří nebo aktualizuje.conf, protože to je
25. * použitý během sestavení.
26. * /
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Chyba během synchronizace konfigurace.\ n \ n ");
30. návrat 1;
31.
32.
33. návrat 0;
34.
- Savedefconfig: Toto pravidlo uloží aktuální .config ve formě ./ defconfig, který je považován za minimální konfigurační soubor. Použijte příkaz: make savedefconfig
- Listnewconfig: Slouží k vypsání nových možností.
- Kvmconfig: To umožňuje možnosti podpory KVM. Použijte příkaz: make kvm_guest.konfigurace
- Allyesconfig: Tím se vytvoří nový konfigurační soubor jádra se všemi možnostmi nastavenými na ano. Je to opak allnokonfigurace.
- Allmodconfig: Tím se vytvoří nová konfigurace jádra, se kterou jsou ve výchozím nastavení povoleny moduly.
- Randconfig: Tím se vytvoří nový konfigurační soubor jádra s náhodnými odpověďmi na všechny možnosti.
- Tinyconfig: Díky tomu je možné nejmenší jádro.
V systému Kconfig je spousta cílů. Mezi běžné patří konfigurace a menuconfig.
Jak již bylo zmíněno, cíle jsou zpracovávány různými programy v hostitelských systémech, a to buď poskytováním grafického uživatelského rozhraní nebo příkazového řádku. Nástroje Kconfig najdete v / scripts / Kconfig ve zdroji jádra.
https: // elixír.bootlin.com / linux / latest / source / scripts / kconfig
https: // elixír.bootlin.com / linux / latest / source / scripts / kconfig / Makefile
Prvním procesem je obvykle čtení souboru Kconfig v kořenovém adresáři, který se používá k vytvoření počáteční konfigurační databáze. Jak proces pokračuje, databáze se aktualizuje při čtení souborů v následujícím pořadí:
.konfigurace/ lib / modules / $ (shell, uname-r) /.konfigurace
/ etc / kernel-config
/ boot / config - $ (shell, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.konfigurační soubor je poté spuštěn na syncconfig, který přijímá .konfigurační soubor jako vstup. Zpracovává soubor a vydává soubory, které jsou poté klasifikovány do různých kategorií, například:
- autoconf.h: Používá se pro zdrojové soubory jazyka C.
- auto.conf a tristate.conf: Ty se používají pro zpracování textu Makefile.
- / includes / config: Jedná se o prázdné soubory záhlaví používané při sledování závislostí.
Kbuild Files
Téměř všechny soubory jádra jsou soubory Kbuild Makefiles, které používají infrastrukturu Kbuild, což je funkce rekurzivní tvorby. Rekurzivní Make je způsob použití nástroje Make jako příkazu v Makefile. Rekurze je velmi užitečná při kompilaci velkého projektu.
Kbuild funguje odkazem na všechny soubory, které jsme zmínili ve výše uvedené části.
Systém Kbuild staví své komponenty pomocí špičkového Makefile, který obsahuje arch Makefiles s názvem arch / $ (ARCH) / Makefile v konfiguračních souborech. Rekurzivně sestupuje do podadresářů vyvolávajících Make na komponentách pomocí rutin ve skriptech / Makefile.*. Kbuild poté staví na sousedním objektu a spojuje je do objektů a vytváří vmlinux.
Další informace o syntaxi používané v Kbuild Makefiles najdete v dokumentaci.
Zvažte následující skript.
https: // github.com / torvalds / linux / blob / master / skripty / link-vmlinux.sh
Soubory objektů o použité k vytvoření vmlinuxu jsou nejprve zkompilovány do příslušných vestavěných .soubory jako var KBUILD_VMLINUX_INIT, MAIN, LIBS. Jsou složeny z vmlinuxu.
https: // github.com / torvalds / linux / blob / master / skripty / Makefile.stavět
Závěr
V této příručce jsme se podívali na systémy Kbuild a Kconfig v systému sestavení jádra a na jeho fungování. Jak jsme zmínili na začátku kurzu, diskutovaná témata jsou široká a nelze je zahrnout do jediného kurzu.