For at administrere og reducere denne kompleksitet organiserer softwareudviklere kode i små filer, der linker til bestemte moduler. Udviklere kan kompilere hver af disse filer separat og derefter linke dem sammen for at oprette en endelig softwarekørsel.
Et eksempel på dette er C-projekter, der består af kildekodefiler i .c udvidelser og softwaregrænseflader i .h udvidelser. Hver kildefil bliver samlet sammen med de headerfiler, der skal oprettes. o objekter, der er knyttet sammen ved hjælp af biblioteker, hvorved eksekverbare filer oprettes.
For at udføre denne proces bruger softwareudviklere værktøjer, såsom Make, til at automatisere byggeprocessen og krævede filafhængigheder. Make bruger Makefiles til at styre opførelsen af kompileringsprocessen.
GNU Make-værktøjerne indeholder et sæt regler og konventioner, der bruges til at oprette Makefiles og reducere kompleksiteten i forbedring af effektiviteten.
I denne vejledning vil vi specifikt diskutere Linux Kernel Makefiles Kconfig og Kbuild.
Før vi begynder, er det godt at bemærke, at denne artikel ikke foregiver at lære alt om Kernel Build-systemet. Vi giver dog et overblik på højt niveau af opbygning af et vmlinux-billede og moduler.
Hvis du ønsker oplysninger, der ligger uden for omfanget af denne tutorial, anbefaler vi følgende ressource for bedre information:
https: // linkfy.til / goMakefilesDocs
https: // linkfy.til / gnuMake
Kernel Makefiles: En oversigt
Kernel Build System, også kaldet konfigurationssystemet, er et vigtigt værktøj - for dem der har brug for det - der har eksisteret i et stykke tid. Imidlertid vil ikke alle bruge dette system; selv drivere og andre softwareudviklere på lavt niveau bruger det sjældent. Da du læser dette, betyder det, at du vil vide mere om Kernel Build System.
Således diskuterer vi, hvordan kernen bliver kompileret, og diskuterer Kbuild og Kconfig-systemet, så du kan forstå dem bedre.
Kernel Makefile har fem kernekomponenter:
- Makefile: Dette er den øverste fabrikatfil, der er placeret i kildens rod.
- arch / $ (ARCH) Makefile: Dette er buen Makefile; det fungerer som et supplement til den øverste Makefile.
- .config: Dette er kernekonfigurationsfilen.
- Scripts / Makefile.*: Dette definerer fastsatte regler for alle kbuild Makefiles.
- Kbuild Makefiles: Der er omkring 500 kbuild Makefiles, og de er ikke særlig lette at læse. Overvej en fil som:
https: // eliksir.bootlin.com / linux / seneste / kilde / scripts / Kbuild.omfatte
Kconfig
Kconfig-filen indeholder moduler, der hjælper med at bruge make * config. Det hjælper kernen med at lave selektive konfigurationer, hvilket skaber modularitet og tilpasning til kerneprocessen.
Der er forskellige konfigurationsmål specificeret af Kconfig-systemet. Du kan bruge hjælp til at se de tilgængelige mål. Disse mål behandles af forskellige programmer leveret af kernen under byggeprocessen.
Nogle af Kconfig-målene inkluderer:
- Konfiguration: Dette bruges til at opdatere kernekonfigurationsfilen ved hjælp af linjeprogrammet.
- Menukonfiguration: Dette er en Kconfig-funktion eller -mekanisme, der giver menubaseret adgang til Kernel-indstillinger. For at starte menuconfig og andre Kconfig-funktioner skal du være inde i platformens projektmappe. Du kan bruge følgende til at starte Kconfig menuconfig-funktionen. Du kan dog også starte menuconfig med andre GUI Linux Kernel-konfigurationsfunktioner såsom xconfig og gconfig. lav linux-windriver.menuconfig - Udfører menuconfig i en separat terminalsession.
- gconfig og xconfig: Gconfig aktiverer GUI-baserede Linux Kernel-funktioner. Gconfig bruger det GTK- eller (X-baserede) brugergrænseflade. På den anden side bruger Xconfig Qt-baseret brugergrænseflade. Brug følgende kommandoer til at starte henholdsvis gconfig og xconfig:
lav linux-windriver.xconfig
BEMÆRK: For at bruge gconfig og xconfig skal du have QT-udviklingsværktøjerne installeret på værtssystemet.
- Nconfig: Nconfig-funktionen kører den aktuelle konfiguration (Buildtools) og gælder for det menustyrede program Ncurses. Dette giver dig mulighed for at vælge de pakker, der skal bygges, såsom CPU, drivere og filsystem, når du bygger kernen. Brug kommandoen: make nconfig.
- Oldconfig: Den oldconfig-funktion giver dig mulighed for at anvende nyere .konfigurationsfiler til ældre kernekonfigurationsfiler. For eksempel en gammel .konfigurationsfil og en nyere .konfigurationsfil (nyere kerneversion) vil have forskelle, hvilket betyder, at du skal opdatere den aktuelle konfiguration, før kernen bygges. Du kan bruge make oldconfig til at opdatere den gamle config interaktivt ved at anvende indstillinger, der mangler i den gamle config-fil.
- Defconfig: Denne funktion giver kernel build-systemet mulighed for at tilføje en ny config leveret af defconfig til .konfigurationsfil. Mere præcist kontrollerer Kbuild-systemet alle Kconfig-filer. Hvis defconfig angiver en indstilling i filen, bruger Kbuild-systemet den angivne værdi til at tilføje indstillingen til .config. Hvis defconfig ikke nævner muligheden, bruger Kbuild standardværdier i .config.
Overvej følgende:
Defconfig kode snapshot fra følgende ressource:
https: // eliksir.bootlin.com / linux / v5.9 / source / scripts / kconfig / Makefile # L98
1. defconfig: $ (obj) / conf2. ifneq ($ (wildcard $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Standardkonfiguration er baseret på '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. andet
6. @ $ (kecho) "*** Standardkonfiguration er baseret på målet '$ (KBUILD_DEFCONFIG)'"
7. $ (Q) $ (MAKE) -f $ (srctree) / Makefile $ (KBUILD_DEFCONFIG)
8. Afslut Hvis
9.
10. % _defconfig: $ (obj) / conf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configfiles = $ (wildcard $ (srctree) / kernel / configs / $ @ $ (srctree) / arch / $ (SRCARCH) / configs / $ @)
14.
15. %.config: $ (obj) / conf
16. $ (hvis $ (call configfiles) ,, $ (fejl Der findes ingen konfiguration for dette mål på denne arkitektur))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / scripts / kconfig / merge_config.sh -m .config $ (configfiles)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Oldconfig kode snapshot fra følgende ressource:
https: // eliksir.bootlin.com / linux / v5.9 / kilde / scripts / kconfig / conf.c # L694
1. sag olddefconfig:2. Standard:
3. pause;
4.
5.
6. hvis (input_mode == gemtefconfig)
7. hvis (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Fejl under lagring af defconfig til:% s \ n \ n",
9. defconfig_file);
10. returnere 1;
11.
12. ellers hvis (input_mode != listnewconfig && input_mode != helpnewconfig)
13. hvis (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Fejl under skrivning af konfigurationen.\ n \ n ");
15. udgang (1);
16.
17.
18. / *
19. * Opret automatisk.conf, hvis den ikke findes.
20. * Dette forhindrer GNU Make 4.1 eller ældre fra at udsende
21. * "inkluderer / config / auto.conf: Ingen sådan fil eller katalog "
22. * i Makefile på øverste niveau
23. *
24. * syncconfig opretter eller opdaterer altid automatisk.conf fordi det er
25. * brugt under build.
26. * /
27. hvis (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Fejl under synkronisering af konfigurationen.\ n \ n ");
30. returnere 1;
31.
32.
33. returnere 0;
34.
- Savedefconfig: Denne regel gemmer strømmen .konfigurere i form af ./ defconfig, som betragtes som en minimal konfigurationsfil. Brug kommandoen: make savedefconfig
- Listnewconfig: Dette bruges til at liste nye muligheder.
- Kvmconfig: Dette muliggør muligheder for KVM-support. Brug kommandoen: make kvm_guest.config
- Allyesconfig: Dette bygger en ny kernel-konfigurationsfil med alle indstillinger indstillet til ja. Det er det modsatte af allnoconfig.
- Allmodconfig: Dette bygger en ny kernekonfiguration, som moduler er aktiveret som standard.
- Randconfig: Dette bygger en ny kernekonfigurationsfil med tilfældige svar på alle muligheder.
- Tinyconfig: Dette gør den mindste kerne mulig.
Der er mange mål i Kconfig-systemet. Nogle almindelige inkluderer config og menuconfig.
Som nævnt behandles målene af forskellige programmer i værtssystemerne, enten med en GUI eller kommandolinje. Du kan finde Kconfig-værktøjer i / scripts / Kconfig i kernekilden.
https: // eliksir.bootlin.com / linux / seneste / kilde / scripts / kconfig
https: // eliksir.bootlin.com / linux / nyeste / source / scripts / kconfig / Makefile
Den første proces er normalt at læse Kconfig-filen i rodmappen, som bruges til at oprette en indledende konfigurationsdatabase. Efterhånden som processen fortsætter, opdateres databasen, når filer læses i følgende rækkefølge:
.config/ lib / modules / $ (shell, uname-r) /.config
/ etc / kernel-config
/ boot / config - $ (shell, uname-r)
ARCH_DEFCONFIG
bue / $ (ARCH) / defconfig
.config-fil droppes derefter til syncconfig, som accepterer .konfigurationsfil som input. Det behandler filen og output filer, som derefter klassificeres i forskellige kategorier såsom:
- autokonf.h: Dette bruges til C-sprogkildefiler.
- auto.conf og tristate.conf: Disse bruges til Makefile tekstbehandling.
- / inkluderer / config: Dette er tomme headerfiler, der bruges i afhængighedssporing.
Kbuild Files
Næsten alle Kernel-filer er Kbuild Makefiles, der bruger Kbuild-infrastrukturen, som er en rekursiv make-funktion. Rekursivt Make er en måde at bruge Make-værktøjet på som en kommando i en Makefile. Rekursion er meget nyttig ved kompilering af et stort projekt.
Kbuild fungerer ved at henvise til alle de filer, vi nævnte i ovenstående afsnit.
Kbuild-systemet bygger sine komponenter ved hjælp af den øverste Makefile, der inkluderer buen Makefiles med navnet arch / $ (ARCH) / Makefile i konfigurationsfilerne. Det falder rekursivt ned i underkataloger, der påberåber sig Make på komponenterne ved hjælp af rutinerne i scripts / Makefile.*. Kbuild bygger derefter på det tilstødende objekt og forbinder dem til objekter, hvilket skaber vmlinux.
For at lære mere om syntaksen, der bruges i Kbuild Makefiles, henvises til dokumentationen.
Overvej følgende script.
https: // github.com / torvalds / linux / blob / master / scripts / link-vmlinux.sh
O-objektfiler, der bruges til at oprette vmlinux, kompileres først i deres respektive indbyggede .a filer som var KBUILD_VMLINUX_INIT, MAIN, LIBS. Disse er sammensat i vmlinux.
https: // github.com / torvalds / linux / blob / master / scripts / Makefile.bygge
Konklusion
I denne vejledning kiggede vi på Kbuild- og Kconfig-systemer i Kernel-byggesystemet, og hvordan det fungerer. Som vi nævnte i begyndelsen af tutorialen, er de diskuterede emner brede og kan ikke dækkes i en enkelt tutorial.