Selle keerukuse haldamiseks ja vähendamiseks korraldavad tarkvaraarendajad koodi väikestes failides, mis viitavad konkreetsetele moodulitele. Arendajad saavad kõik need failid eraldi kompileerida ja seejärel linkida, et luua lõplik tarkvara käivitatav fail.
Selle näiteks on C-i lähtekoodifailidest koosnevad C-projektid .c laiendused ja tarkvaraliidesed .h pikendused. Iga lähtefail kompileeritakse koos loodavate päisefailidega. o objektid, mis on lingitud teekide abil, luues seeläbi käivitatavad failid.
Selle protsessi teostamiseks kasutavad tarkvaraarendajad tööriistu, näiteks Make, et automatiseerida koostamisprotsessi ja nõutavaid failisõltuvusi. Make kasutab kompileerimisprotsessi käitumise haldamiseks Makefileesi.
Tööriistad GNU Make pakuvad Makefileesi loomisel kasutatavaid reegleid ja tavasid ning vähendavad tõhususe parandamise keerukust.
Selles õpetuses käsitleme konkreetselt Linuxi tuuma Makefileesi Kconfig ja Kbuild.
Enne alustamist on hea märkida, et see artikkel ei pretendeeri kõigele, mis õpetaks kernelikonstruktsioonide süsteemi. Pakume siiski kõrgetasemelist ülevaadet vmlinuxi pildi ja moodulite ehitamisest.
Kui soovite teavet selle õpetuse raamest väljaspool, soovitame parema teabe saamiseks järgmist ressurssi:
https: // linkfy.to / goMakefilesDocs
https: // linkfy.to / gnuMake
Kernel Makefiles: ülevaade
Kerneli loomise süsteem, mida nimetatakse ka konfiguratsioonisüsteemiks, on hädavajalik tööriist neile, kes seda vajavad, mis on juba mõnda aega olnud. Kõik ei kasuta seda süsteemi; isegi draiverid ja muud madala taseme tarkvaraarendajad kasutavad seda harva. Kuna loete seda, tähendab see, et soovite rohkem teada saada kerneli loomise süsteemist.
Seega arutame, kuidas kernel kompileeritakse, ja arutame süsteemi Kbuild ja Kconfig, et saaksite neist paremini aru saada.
Kernel Makefile'il on viis põhikomponenti:
- Makefile: See on top make fail, mis asub lähtejuuris.
- arch / $ (ARCH) Makefile: See on võlv Makefile; see toimib Makefile'i tippu täiendusena.
- .config: See on kerneli konfiguratsioonifail.
- Skriptid / Makefile.*: See määratleb kõigi kbuild Makefile'i seaded.
- Kbuild Makefiles: Makefileid on umbes 500 kbuildi ja neid pole eriti lihtne lugeda. Mõelge näiteks järgmisele failile:
https: // eliksiir.bootlin.com / linux / latest / source / scripts / Kbuild.hõlmama
Kconfig
Kconfigi fail sisaldab mooduleid, mis on abiks make * config kasutamisel. See aitab kernelil teha valikulisi konfiguratsioone, luues tuuma loomisprotsessi jaoks modulaarsuse ja kohandatavuse.
Kconfigi süsteem on määranud mitu konfiguratsiooni sihtmärki. Saadaolevate sihtmärkide kuvamiseks võite kasutada abi make. Neid sihtmärke töödeldakse mitmesuguste programmide abil, mille tuum pakkus ehitamise ajal.
Mõned Kconfigi sihtmärgid hõlmavad järgmist
- Konfigureerimine: Seda kasutatakse kerneli konfiguratsioonifaili värskendamiseks reaprogrammi abil.
- Menukonfig: See on Kconfigi funktsioon või mehhanism, mis pakub menüüpõhist juurdepääsu kerneli suvanditele. Menuconfigi ja muude Kconfigi funktsioonide käivitamiseks peaksite olema platvormi projekti kataloogis. Funktsiooni Kconfig menuconfig käivitamiseks saate kasutada järgmist. Siiski saate menukonfig käivitada ka teiste GUI Linuxi kerneli konfigureerimisfunktsioonidega nagu xconfig ja gconfig. tee linux-windriver.menuconfig - käivitab menuconfigi eraldi terminaliseansis.
- gconfig ja xconfig: Gconfig aktiveerib GUI-põhised Linuxi kerneli funktsioonid. Gconfig kasutab GTK või (X-põhist) põhinevat kasutajaliidest. Teiselt poolt kasutab Xconfig Qt-põhist kasutajaliidest. Kasutage järgmisi käske vastavalt gconfig ja xconfig käivitamiseks:
teha linux-windriver.xconfig
MÄRGE: Gconfigi ja xconfigi kasutamiseks peaksid hostisüsteemi olema installitud QT arendustööriistad.
- Nconfig: Funktsioon Nconfig käivitab praeguse konfiguratsiooni (Buildtools) ja kehtib menüüpõhise programmi Ncurses jaoks. See võimaldab teil kerneli loomisel valida ehitatavad paketid, näiteks protsessor, draiverid ja failisüsteem. Kasutage käsku: make nconfig.
- Oldconfig: Funktsioon oldconfig võimaldab teil uuemat rakendada .konfigureerimisfailid vanemate kerneli konfiguratsioonifailideks. Näiteks vana .konfigureerimisfail ja uuem .config-failil (uuem kerneli versioon) on erinevusi, see tähendab, et peate enne tuuma ehitamist värskendama praegust konfiguratsiooni. Vana konfiguratsiooni interaktiivseks värskendamiseks võite kasutada make oldconfig, kasutades vanas konfiguratsioonifailis puuduvaid valikuid.
- Defconfig: See funktsioon võimaldab kernli ehitussüsteemil lisada uue konfiguratsiooni, mille tarnib defconfig .konfigureerimisfail. Täpsemalt kontrollib Kbuildi süsteem kõiki Kconfigi faile. Kui defconfig määrab failis suvandi, kasutab Kbuildi süsteem valiku lisamiseks määratud väärtust .konfig. Kui defconfig ei maini valikut, kasutab Kbuild failis vaikeväärtusi .konfig.
Mõelge järgmisele:
Defconfig koodipilt järgmisest ressursist:
https: // eliksiir.bootlin.com / linux / v5.9 / source / scripts / kconfig / Makefile # L98
1. defconfig: $ (obj) / conf2. ifneq ($ (metamärk $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Vaikekonfiguratsioon põhineb '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. muud
6. @ $ (kecho) "*** Vaikekonfiguratsioon põhineb eesmärgil '$ (KBUILD_DEFCONFIG)'"
7. $ (Q) $ (MAKE) -f $ (srctree) / Makefile $ (KBUILD_DEFCONFIG)
8. endif
9.
10. % _defconfig: $ (obj) / konf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configfiles = $ (metamärk $ (srctree) / kernel / configs / $ @ $ (srctree) / arch / $ (SRCARCH) / configs / $ @)
14.
15. %.config: $ (obj) / conf
16. $ (kui $ (call configfiles) ,, $ (tõrge Selles arhitektuuris pole selle sihtmärgi jaoks konfiguratsiooni))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / skriptid / kconfig / merge_config.sh-m .config $ (configfiles)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Oldconfigi koodi hetktõmmis järgmisest ressursist:
https: // eliksiir.bootlin.com / linux / v5.9 / source / scripts / kconfig / conf.c # L694
1. juhtum olddefconfig:2. vaikimisi:
3. murda;
4.
5.
6. if (sisend_režiim == salvestatudkonfig)
7. kui (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Viga defconfig salvestamisel asukohta:% s \ n \ n",
9. defconfig_file);
10. tagastus 1;
11.
12. else if (sisend_režiim != listnewconfig && input_mode != helpnewconfig)
13. kui (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Viga konfiguratsiooni kirjutamisel.\ n \ n ");
15. väljapääs (1);
16.
17.
18. / *
19. * Loo automaatne.konf, kui seda pole olemas.
20. * See takistab GNU Make 4-d.1 või vanem kiirgamisest
21. * "include / config / auto.conf: pole sellist faili ega kataloogi "
22. * tipptasemel Makefile'is
23. *
24. * syncconfig loob või uuendab alati automaatselt.konf, sest see on
25. * kasutatud ehitamise ajal.
26. * /
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Viga konfiguratsiooni sünkroonimisel.\ n \ n ");
30. tagastus 1;
31.
32.
33. tagastama 0;
34.
- Savedefconfig: See reegel salvestab praeguse .config kujul ./ defconfig, mida peetakse minimaalseks konfiguratsioonifailiks. Kasutage käsku: make savedefconfig
- Listnewconfig: Seda kasutatakse uute suvandite loetlemiseks.
- Kvmconfig: See võimaldab KVM-i toe valikuid. Kasutage käsku: make kvm_guest.konfig
- Allyesconfig: See ehitab uue kerneli konfiguratsioonifaili, kus kõik suvandid on määratud jah. See on vastupidine allnoconfigile.
- Allmodconfig: See loob uue kerneli konfiguratsiooni, millega moodulid on vaikimisi lubatud.
- Randconfig: See loob uue kerneli konfiguratsioonifaili juhuslike vastustega kõigile valikutele.
- Tinyconfig: See muudab väikseima võimaliku tuuma.
Kconfigi süsteemis on palju sihtmärke. Mõned levinumad on config ja menuconfig.
Nagu mainitud, töötlevad sihtmärke hostisüsteemide erinevad programmid, pakkudes kas GUI või käsurida. Kconfigi tööriistad leiate kerneli allikast kataloogist / scripts / Kconfig.
https: // eliksiir.bootlin.com / linux / latest / source / scripts / kconfig
https: // eliksiir.bootlin.com / linux / latest / source / scripts / kconfig / Makefile
Esimene protsess on tavaliselt juurkataloogis oleva Kconfigi faili lugemine, mida kasutatakse esialgse konfiguratsiooni andmebaasi loomiseks. Protsessi jätkudes värskendatakse andmebaasi failide lugemisel järgmises järjekorras:
.konfig/ lib / modules / $ (shell, uname-r) /.konfig
/ etc / kernel-config
/ boot / config - $ (shell, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.konfigureerimisfail kukutatakse seejärel failile syncconfig, mis aktsepteerib .konfiguratsioonifail sisendina. See töötleb faili ja väljastab failid, mis seejärel liigitatakse erinevatesse kategooriatesse, näiteks:
- autokonf.h: Seda kasutatakse C-keele lähtefailide jaoks.
- automaatne.konf ja tristate.konf: Neid kasutatakse Makefile'i tekstitöötluseks.
- / sisaldab / config: Need on tühjad päisefailid, mida kasutatakse sõltuvuse jälgimisel.
Kbuildi failid
Peaaegu kõik kerneli failid on Kbuild Makefiles, mis kasutavad Kbuildi infrastruktuuri, mis on rekursiivne make-funktsioon. Rekursiivne Make on viis tööriista Make kasutamiseks Makefile'is käsuna. Rekursioon on suure projekti koostamisel väga kasulik.
Kbuild töötab viidates kõigile ülalnimetatud failides mainitud failidele.
Kbuildi süsteem ehitab oma komponendid ülemise Makefile'i abil, mis sisaldab konfiguratsioonifailides arhi Makefileid nimega arch / $ (ARCH) / Makefile. See laskub rekursiivselt alamkataloogidesse, kutsudes komponentidele Make-i, kasutades skripte / Makefile'i rutiini.*. Seejärel ehitab Kbuild külgneva objekti ja seob need objektideks, luues vmlinuxi.
Lisateavet Kbuild Makefilesis kasutatava süntaksi kohta leiate dokumentatsioonist.
Mõelge järgmisele skriptile.
https: // github.com / torvalds / linux / blob / master / scripts / link-vmlinux.sh
Vmlinuxi loomiseks kasutatud o-objektifailid kompileeritakse kõigepealt nende vastavasse sisseehitatud .failid var KBUILD_VMLINUX_INIT, MAIN, LIBS. Need on koostatud vmlinuxis.
https: // github.com / torvalds / linux / blob / master / scripts / Makefile.ehitama
Järeldus
Selles juhendis vaatasime Kerneli ehitussüsteemi Kbuildi ja Kconfigi süsteeme ning kuidas see töötab. Nagu me õpetuse alguses mainisime, on käsitletud teemad laialdased ja neid ei saa käsitleda ühes õpetuses.