Za upravljanje in zmanjšanje te zapletenosti razvijalci programske opreme organizirajo kodo v majhne datoteke, ki se povezujejo na določene module. Razvijalci lahko vsako od teh datotek zberejo ločeno in jih nato povežejo, da ustvarijo končno izvedljivo programsko opremo.
Primer tega so projekti C, sestavljeni iz datotek izvorne kode v .c razširitve in programski vmesniki v .h razširitve. Vsaka izvorna datoteka se prevede skupaj z datotekami glave za ustvarjanje. o predmeti, povezani skupaj s knjižnicami, s čimer se ustvarijo izvršljive datoteke.
Za izvedbo tega postopka razvijalci programske opreme uporabljajo orodja, kot je Make, za avtomatizacijo postopka gradnje in zahtevanih odvisnosti datotek. Make uporablja datoteke Makefiles za upravljanje vedenja postopka prevajanja.
Orodja GNU Make ponujajo nabor pravil in konvencij, ki se uporabljajo za ustvarjanje datotek Makefiles in zmanjšujejo zapletenost pri izboljšanju učinkovitosti.
V tej vadnici bomo posebej obravnavali Linux Kernel Makefiles Kconfig in Kbuild.
Preden začnemo, je dobro opozoriti, da se ta članek ne pretvarja, da govori o sistemu Kernel Build. Vendar pa nudimo pregled na visoki ravni o izdelavi slike in modulov vmlinux.
Če želite informacije, ki presegajo obseg te vadnice, priporočamo naslednji vir za boljše informacije:
https: // linkfy.na / goMakefilesDocs
https: // linkfy.do / gnuMake
Datoteke jeder: pregled
Kernel Build System, imenovan tudi sistem za konfiguriranje, je bistveno orodje - za tiste, ki ga potrebujejo - ki obstaja že nekaj časa. Vendar tega sistema ne bodo uporabljali vsi; tudi gonilniki in drugi razvijalci programske opreme na nizki ravni ga redko uporabljajo. Ker berete to, pomeni, da želite vedeti več o sistemu zgradbe jedra.
Tako bomo razpravljali o tem, kako se zbere jedro, in razpravljali o sistemih Kbuild in Kconfig, da jih boste lahko bolje razumeli.
Kernel Makefile ima pet osnovnih komponent:
- Makefile: To je zgornja datoteka make, ki se nahaja v izvornem korenu.
- Arch / $ (ARCH) Makefile: To je ločni Makefile; deluje kot dodatek k vrhunski datoteki Makefile.
- .config: To je konfiguracijska datoteka jedra.
- Skripti / Makefile.*: To definira nastavljena pravila za vse datoteke kbuild Make.
- Kbuild Makefiles: Makefile je približno 500 kbuild in jih ni prav lahko prebrati. Razmislite o datoteki, kot je:
https: // eliksir.bootlin.com / linux / najnovejši / vir / skripte / Kbuild.vključujejo
Kconfig
Datoteka Kconfig vsebuje module, ki pomagajo pri uporabi make * config. Kernelu pomaga pri selektivnih konfiguracijah, kar ustvarja modularnost in prilagodljivost za postopek gradnje jedra.
Sistem Kconfig določa različne konfiguracijske cilje. Pomoč za pomoč lahko uporabite za ogled razpoložljivih ciljev. Te cilje obdelujejo različni programi, ki jih med postopkom gradnje ponuja jedro.
Nekateri cilji Kconfig vključujejo:
- Konfiguracija: To se uporablja za posodobitev konfiguracijske datoteke jedra s pomočjo linijskega programa.
- Menuconfig: To je funkcija ali mehanizem Kconfig, ki ponuja dostop do možnosti jedra na osnovi menija. Če želite zagnati menuconfig in druge funkcije Kconfig, morate biti v imeniku projekta platforme. Za zagon funkcije Kconfig menuconfig lahko uporabite naslednje. Lahko pa zaženete tudi menuconfig z drugimi funkcijami konfiguracije jedra Linuxa, kot sta xconfig in gconfig. naredite linux-windriver.menuconfig - izvrši menuconfig v ločeni terminalski seji.
- gconfig in xconfig: Gconfig aktivira funkcije jedra Linuxa na osnovi GUI. Gconfig uporablja uporabniški vmesnik na osnovi GTK ali (na osnovi X). Po drugi strani Xconfig uporablja uporabniški vmesnik, ki temelji na Qt. Za zagon gconfig in xconfig uporabite naslednje ukaze:
naredite linux-windriver.xconfig
OPOMBA: Za uporabo gconfig in xconfig morate imeti v gostiteljskem sistemu nameščena razvojna orodja QT.
- Nconfig: Funkcija Nconfig zažene trenutno konfiguracijo (Buildtools) in velja za program, ki ga poganja meni Ncurses. To vam omogoča, da pri gradnji jedra izberete pakete za gradnjo, kot so CPU, gonilniki in datotečni sistem. Uporabite ukaz: make nconfig.
- Oldconfig: Funkcija oldconfig vam omogoča uporabo novejših .config datoteke v starejše konfiguracijske datoteke jedra. Na primer staro .datoteko in novejšo .datoteka config (novejša različica jedra) bo imela razlike, kar pomeni, da morate posodobiti trenutno konfiguracijo pred gradnjo jedra. Make oldconfig lahko uporabite za interaktivno posodobitev stare konfiguracije z uporabo možnosti, ki manjkajo v stari konfiguracijski datoteki.
- Defconfig: Ta funkcija omogoča sistemu zgradbe jedra, da doda novo konfiguracijo, ki jo je zagotovil defconfig, v .nastavitveno datoteko. Natančneje, sistem Kbuild preveri vse datoteke Kconfig. Če defconfig določi možnost v datoteki, sistem Kbuild uporabi določeno vrednost, da doda možnost v datoteko .konfig. Če defconfig možnosti ne omenja, Kbuild uporabi privzete vrednosti v .konfig.
Upoštevajte naslednje:
Posnetek kode Defconfig iz naslednjega vira:
https: // eliksir.bootlin.com / linux / v5.9 / source / scripts / kconfig / Makefile # L98
1. defconfig: $ (obj) / conf2. ifneq ($ (nadomestni znak $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Privzeta konfiguracija temelji na '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. drugače
6. @ $ (kecho) "*** Privzeta konfiguracija temelji na cilju '$ (KBUILD_DEFCONFIG)'"
7. $ (Q) $ (MAKE) -f $ (srctree) / Makefile $ (KBUILD_DEFCONFIG)
8. endif
9.
10. % _defconfig: $ (obj) / conf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configfiles = $ (nadomestni znak $ (srctree) / kernel / configs / $ @ $ (srctree) / arch / $ (SRCARCH) / configs / $ @)
14.
15. %.konfiguracija: $ (obj) / conf
16. $ (če $ (pokliči configfiles) ,, $ (napaka Za ta cilj v tej arhitekturi ne obstaja nobena konfiguracija))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / scripts / kconfig / merge_config.sh-m .config $ (configfiles)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Posnetek kode Oldconfig iz naslednjega vira:
https: // eliksir.bootlin.com / linux / v5.9 / source / scripts / kconfig / conf.c # L694
1. case olddefconfig:2. privzeto:
3. odmor;
4.
5.
6. če (input_mode == savedefconfig)
7. če (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Napaka pri shranjevanju defconfig v:% s \ n \ n",
9. defconfig_file);
10. vrnitev 1;
11.
12. drugače, če (input_mode != listnewconfig && input_mode != helpnewconfig)
13. če (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Napaka med pisanjem konfiguracije.\ n \ n ");
15. izhod (1);
16.
17.
18. / *
19. * Ustvari samodejno.conf, če ne obstaja.
20. * To preprečuje GNU Make 4.1 ali starejši od oddajanja
21. * "vključi / konfiguriraj / samodejno.conf: ni take datoteke ali imenika "
22. * v najvišji datoteki Makefile
23. *
24. * syncconfig vedno samodejno ustvari ali posodobi.conf, ker je
25. * uporabljeno med gradnjo.
26. * /
27. če (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Napaka med sinhronizacijo konfiguracije.\ n \ n ");
30. vrnitev 1;
31.
32.
33. vrnitev 0;
34.
- Savedefconfig: To pravilo shrani trenutno .v obliki ./ defconfig, ki velja za minimalno konfiguracijsko datoteko. Uporabite ukaz: make savedefconfig
- Listnewconfig: To se uporablja za seznam novih možnosti.
- Kvmconfig: To omogoča možnosti za podporo KVM. Uporabite ukaz: make kvm_guest.konfig
- Allyesconfig: Tako se ustvari nova konfiguracijska datoteka jedra z vsemi možnostmi, nastavljenimi na da. To je nasprotje allnoconfig.
- Allmodconfig: S tem je zgrajena nova konfiguracija jedra, s katero so moduli privzeto omogočeni.
- Randconfig: S tem je zgrajena nova konfiguracijska datoteka jedra z naključnimi odgovori na vse možnosti.
- Tinyconfig: To omogoča najmanjše možno jedro.
V sistemu Kconfig je veliko tarč. Nekateri pogosti vključujejo config in menuconfig.
Kot smo že omenili, cilje obdelujejo različni programi v gostiteljskih sistemih, bodisi z GUI ali ukazno vrstico. Orodja Kconfig najdete v / scripts / Kconfig v izvoru jedra.
https: // eliksir.bootlin.com / linux / latest / source / scripts / kconfig
https: // eliksir.bootlin.com / linux / latest / source / scripts / kconfig / Makefile
Prvi postopek je običajno branje datoteke Kconfig v korenskem imeniku, ki se uporablja za izdelavo začetne konfiguracijske baze podatkov. Ko se postopek nadaljuje, se baza podatkov posodobi pri branju datotek v naslednjem vrstnem redu:
.konfig/ lib / modules / $ (lupina, uname-r) /.konfig
/ etc / kernel-config
/ boot / config - $ (lupina, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.Datoteka config se nato spusti na syncconfig, ki sprejme .kot vhodno datoteko. Datoteko obdela in izpiše datoteke, ki so nato razvrščene v različne kategorije, kot so:
- autoconf.h: Uporablja se za izvorne datoteke v jeziku C.
- samodejno.conf in tristate.conf: Uporabljajo se za obdelavo besedila Makefile.
- / vključuje / config: To so prazne datoteke glave, ki se uporabljajo pri sledenju odvisnosti.
Kbuild Datoteke
Skoraj vse datoteke jedra so datoteke Kbuild Makefiles, ki uporabljajo infrastrukturo Kbuild, ki je rekurzivna funkcija izdelave. Rekurzivna znamka je način uporabe orodja Make kot ukaz v datoteki Make. Rekurzija je zelo koristna pri sestavljanju velikega projekta.
Kbuild deluje tako, da se sklicuje na vse datoteke, ki smo jih omenili v zgornjem razdelku.
Sistem Kbuild gradi svoje komponente z uporabo zgornje datoteke Makefile, ki vključuje lokacijske datoteke z imenom arch / $ (ARCH) / Makefile v nastavitvenih datotekah. Rekurzivno se spusti v podimenike, ki na komponentah prikličejo Make z uporabo rutin v skripti / Makefile.*. Nato Kbuild nadgradi sosednji objekt in jih poveže v predmete ter ustvari vmlinux.
Če želite izvedeti več o sintaksi, ki se uporablja v Kbuild Makefiles, glejte dokumentacijo.
Razmislite o naslednjem skriptu.
https: // github.com / torvalds / linux / blob / master / scripts / link-vmlinux.sh
Datoteke o, ki se uporabljajo za ustvarjanje vmlinuxa, so najprej zbrane v njihovih vgrajenih datotekah .datoteke kot var KBUILD_VMLINUX_INIT, MAIN, LIBS. Ti so sestavljeni v vmlinuxu.
https: // github.com / torvalds / linux / blob / master / scripts / Makefile.graditi
Zaključek
V tem priročniku smo si ogledali sisteme Kbuild in Kconfig v sistemu gradnje jedra in kako deluje. Kot smo že omenili na začetku vadnice, so obravnavane teme široke in jih ni mogoče obravnavati v eni vaji.