For å administrere og redusere denne kompleksiteten organiserer programvareutviklere kode i små filer som lenker til bestemte moduler. Utviklere kan kompilere hver av disse filene hver for seg og deretter koble dem sammen for å lage en endelig programvare kjørbar.
Et eksempel på dette er C-prosjekter som består av kildekodefiler i .c utvidelser og programvaregrensesnitt i .h utvidelser. Hver kildefil blir samlet sammen med headerfilene som skal opprettes. o objekter koblet sammen ved hjelp av biblioteker, og derved skaper kjørbare filer.
For å utføre denne prosessen bruker programvareutviklere verktøy, for eksempel Make, for å automatisere byggeprosessen og nødvendige filavhengigheter. Make bruker Makefiles for å styre oppførselen til kompileringsprosessen.
GNU Make-verktøyene gir et sett med regler og konvensjoner som brukes til å lage Makefiles og reduserer kompleksiteten i å forbedre effektiviteten.
I denne opplæringen vil vi diskutere Linux Kernel Makefiles, spesielt Kconfig og Kbuild.
Før vi begynner, er det godt å merke seg at denne artikkelen ikke later til å lære alt om Kernel Build-systemet. Imidlertid gir vi en oversikt på høyt nivå om å bygge et vmlinux-bilde og moduler.
Hvis du vil ha informasjon utenfor omfanget av denne opplæringen, anbefaler vi følgende ressurs for bedre informasjon:
https: // linkfy.til / goMakefilesDocs
https: // linkfy.til / gnuMake
Kernel Makefiles: En oversikt
Kernel Build System, også kalt config-systemet, er et viktig verktøy - for de som trenger det - som har eksistert en stund. Imidlertid vil ikke alle bruke dette systemet; selv drivere og andre programvareutviklere på lavt nivå bruker det sjelden. Siden du leser dette, betyr det at du vil vite mer om Kernel Build System.
Dermed vil vi diskutere hvordan kjernen blir samlet og diskutere Kbuild og Kconfig-systemet slik at du kan forstå dem bedre.
Kernel Makefile har fem kjernekomponenter:
- Makefile: Dette er den øverste merkefilen som ligger i kilderoten.
- arch / $ (ARCH) Makefile: Dette er buen Makefile; det fungerer som et supplement til toppen Makefile.
- .config: Dette er kjernekonfigurasjonsfilen.
- Skript / Makefile.*: Dette definerer fastsatte regler for alle kbuild Makefiles.
- Kbuild Makefiles: Det er omtrent 500 kbuild Makefiles, og de er ikke veldig enkle å lese. Vurder en fil som:
https: // eliksir.bootlin.no / linux / siste / kilde / skript / Kbuild.inkludere
Kconfig
Kconfig-filen inneholder moduler som hjelper når du bruker make * config. Det hjelper kjernen med å lage selektive konfigurasjoner, og skaper modularitet og tilpassbarhet for byggeprosessen til kjernen.
Det er forskjellige konfigurasjonsmål spesifisert av Kconfig-systemet. Du kan bruke hjelpen til å vise tilgjengelige mål. Disse målene behandles av forskjellige programmer levert av kjernen under byggeprosessen.
Noen av Kconfig-målene inkluderer:
- Konfigurer: Dette brukes til å oppdatere kjernekonfigurasjonsfilen ved hjelp av linjeprogrammet.
- Menukonfigurasjon: Dette er en Kconfig-funksjon eller -mekanisme som tilbyr menybasert tilgang til kjernealternativer. For å starte menuconfig og andre Kconfig-funksjoner, bør du være inne i plattformprosjektkatalogen. Du kan bruke følgende for å starte funksjonen Kconfig menuconfig. Du kan imidlertid også starte menuconfig med andre GUI Linux Kernel-konfigurasjonsfunksjoner som xconfig og gconfig. lage linux-windriver.menuconfig - Utfører menuconfig i en egen terminalsession.
- gconfig og xconfig: Gconfig aktiverer GUI-baserte Linux Kernel-funksjoner. Gconfig benytter GTK- eller (X-basert) basert brukergrensesnitt. På den annen side bruker Xconfig Qt-basert brukergrensesnitt. Bruk følgende kommandoer for å starte henholdsvis gconfig og xconfig:
lage linux-windriver.xconfig
MERK: For å bruke gconfig og xconfig, bør du ha QT-utviklingsverktøyene installert på vertssystemet.
- Nconfig: Nconfig-funksjonen kjører den gjeldende konfigurasjonen (Buildtools) og gjelder for Ncurses meny-drevet program. Dette lar deg velge pakkene du vil bygge, for eksempel CPU, drivere og filsystem når du bygger kjernen. Bruk kommandoen: lage nconfig.
- Oldconfig: Oldconfig-funksjonen lar deg bruke nyere .konfigurasjonsfiler til eldre kjernekonfigurasjonsfiler. For eksempel en gammel .konfigurasjonsfil og en nyere .konfigurasjonsfil (nyere kjerneversjon) vil ha forskjeller, noe som betyr at du må oppdatere den gjeldende konfigurasjonen før kjernekonstruksjonen. Du kan bruke make oldconfig til å oppdatere den gamle konfigurasjonen interaktivt ved å bruke alternativer som mangler i den gamle konfigurasjonsfilen.
- Defconfig: Denne funksjonen lar kjernebyggingssystemet legge til en ny konfigurasjon levert av defconfig til .konfigurasjonsfil. Mer presist, Kbuild-systemet sjekker alle Kconfig-filene. Hvis defconfig spesifiserer et alternativ i filen, bruker Kbuild-systemet den angitte verdien for å legge til alternativet i .config. Hvis defconfig ikke nevner alternativet, bruker Kbuild standardverdier i .config.
Vurder følgende:
Defconfig kode øyeblikksbilde fra følgende ressurs:
https: // eliksir.bootlin.no / linux / v5.9 / kilde / skript / kconfig / Makefile # L98
1. defconfig: $ (obj) / conf2. ifneq ($ (jokertegn $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Standardkonfigurasjon er basert på '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. ellers
6. @ $ (kecho) "*** Standardkonfigurasjon er basert på målet '$ (KBUILD_DEFCONFIG)'"
7. $ (Q) $ (MAKE) -f $ (srctree) / Makefile $ (KBUILD_DEFCONFIG)
8. slutt om
9.
10. % _defconfig: $ (obj) / conf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
1. 3. configfiles = $ (jokertegn $ (srctree) / kernel / configs / $ @ $ (srctree) / arch / $ (SRCARCH) / configs / $ @)
14.
15. %.config: $ (obj) / conf
16. $ (hvis $ (call configfiles) ,, $ (feil Ingen konfigurasjon eksisterer for dette målet på denne arkitekturen))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / skript / kconfig / merge_config.sh -m .config $ (configfiles)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Oldconfig kode øyeblikksbilde fra følgende ressurs:
https: // eliksir.bootlin.com / linux / v5.9 / kilde / skript / kconfig / conf.c # L694
1. sak olddefconfig:2. misligholde:
3. gå i stykker;
4.
5.
6. hvis (input_mode == savedefconfig)
7. hvis (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Feil under lagring av defconfig til:% s \ n \ n",
9. defconfig_file);
10. retur 1;
11.
12. ellers hvis (input_mode != listnewconfig && input_mode != helpnewconfig)
1. 3. hvis (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Feil under skriving av konfigurasjonen.\ n \ n ");
15. utgang (1);
16.
17.
18. / *
19. * Opprett auto.conf hvis den ikke eksisterer.
20. * Dette forhindrer GNU Make 4.1 eller eldre fra å sende ut
21. * "inkluderer / config / auto.conf: Ingen slik fil eller katalog "
22. * i Makefile på toppnivå
23. *
24. * syncconfig oppretter eller oppdaterer alltid automatisk.conf fordi det er
25. * brukt under byggingen.
26. * /
27. hvis (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Feil under synkronisering av konfigurasjonen.\ n \ n ");
30. retur 1;
31.
32.
33. retur 0;
34.
- Savedefconfig: Denne regelen lagrer strømmen .konfigurere i form av ./ defconfig, som blir sett på som en minimal konfigurasjonsfil. Bruk kommandoen: make savedefconfig
- Listnewconfig: Dette brukes til å liste opp nye alternativer.
- Kvmconfig: Dette muliggjør alternativer for KVM-støtte. Bruk kommandoen: lag kvm_guest.config
- Allyesconfig: Dette bygger en ny kjernekonfigurasjonsfil med alle alternativene satt til ja. Det er motsatt av allnoconfig.
- Allmodconfig: Dette bygger en ny kjernekonfigurasjon som moduler er aktivert som standard.
- Randconfig: Dette bygger en ny kjernekonfigurasjonsfil med tilfeldige svar på alle alternativene.
- Tinyconfig: Dette gjør den minste kjerne mulig.
Det er mange mål i Kconfig-systemet. Noen vanlige inkluderer config og menuconfig.
Som nevnt behandles målene av forskjellige programmer i vertssystemene, enten med en GUI eller kommandolinje. Du finner Kconfig-verktøy i / scripts / Kconfig i kjernekilden.
https: // eliksir.bootlin.no / linux / siste / kilde / skript / kconfig
https: // eliksir.bootlin.no / linux / siste / kilde / skript / kconfig / Makefile
Den første prosessen er vanligvis å lese Kconfig-filen i rotkatalogen, som brukes til å bygge en innledende konfigurasjonsdatabase. Etter hvert som prosessen fortsetter, oppdateres databasen når du leser filer i følgende rekkefølge:
.config/ lib / modules / $ (shell, uname-r) /.config
/ etc / kernel-config
/ boot / config - $ (shell, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.config-filen slippes deretter til syncconfig, som godtar .konfigurasjonsfil som inndata. Den behandler filen og sender ut filer, som deretter klassifiseres i forskjellige kategorier som:
- autokonf.h: Dette brukes til kildefiler på C-språk.
- auto.conf og tristate.conf: Disse brukes til Makefile tekstbehandling.
- / inkluderer / konfigurerer: Dette er tomme overskriftsfiler som brukes i avhengighetssporing.
Kbuild Files
Nesten alle kjernefiler er Kbuild Makefiles som bruker Kbuild-infrastrukturen, som er en rekursiv merkefunksjon. Recursive Make er en måte å bruke Make-verktøyet som en kommando i en Makefile. Rekursjon er veldig nyttig når du kompilerer et stort prosjekt.
Kbuild fungerer ved å referere til alle filene vi nevnte i avsnittet ovenfor.
Kbuild-systemet bygger komponentene ved hjelp av den øverste Makefile som inkluderer buen Makefiles med navnet arch / $ (ARCH) / Makefile i konfigurasjonsfilene. Den faller rekursivt ned i underkataloger som påkaller Make på komponentene ved hjelp av rutinene i skript / Makefile.*. Kbuild bygger deretter på det tilstøtende objektet og kobler dem til objekter, og skaper vmlinux.
For å lære mer om syntaksen som brukes i Kbuild Makefiles, se dokumentasjonen.
Tenk på følgende manus.
https: // github.com / torvalds / linux / blob / master / scripts / link-vmlinux.sh
O-objektfilene som brukes til å lage vmlinux, blir først samlet i deres respektive innebygde .en filer som var KBUILD_VMLINUX_INIT, MAIN, LIBS. Disse er komponert i vmlinux.
https: // github.com / torvalds / linux / blob / master / scripts / Makefile.bygge
Konklusjon
I denne guiden tok vi en titt på Kbuild- og Kconfig-systemene i Kernel-byggesystemet og hvordan det fungerer. Som vi nevnte i begynnelsen av opplæringen, er emnene som er diskutert brede og kan ikke dekkes i en enkelt opplæring.