Aby zarządzać i zmniejszyć tę złożoność, programiści organizują kod w małych plikach, które łączą się z określonymi modułami. Deweloperzy mogą skompilować każdy z tych plików osobno, a następnie łączyć je ze sobą, aby utworzyć ostateczne oprogramowanie wykonywalne.
Przykładem tego są projekty C złożone z plików kodu źródłowego w .C rozszerzenia i interfejsy oprogramowania w .H rozszerzenia. Każdy plik źródłowy jest kompilowany z plikami nagłówka, aby utworzyć. o Obiekty połączone za pomocą bibliotek, tworząc w ten sposób pliki wykonywalne.
Aby wykonać ten proces, programiści oprogramowania używają narzędzi, takich jak Make, do automatyzacji procesu kompilacji i wymaganych zależności plików. Tworzyć używające pliki do zarządzania zachowaniem procesu kompilacji.
GNU Make Tools zapewnia zestaw reguł i konwencji używanych do tworzenia paliw i zmniejszenia złożoności w poprawie wydajności.
W tym samouczku omówimy w szczególności makefiles z jądra Linux Kconfig I Kbuild.
Zanim zaczniemy, warto zauważyć, że ten artykuł nie udaje wszystkiego o systemie kompilacji jądra. Zapewniamy jednak przegląd na wysokim poziomie budowania obrazu i modułów VMlinux.
Jeśli chcesz uzyskać informacje poza zakresem tego samouczka, zalecamy następujące zasoby, aby uzyskać lepsze informacje:
https: // linkfy.do/gomakefilesDocs
https: // linkfy.do/gnumake
Kernel Makefiles: przegląd
System kompilacji jądra, zwany również systemem konfiguracji, jest niezbędnym narzędziem dla tych, którzy tego potrzebują-istnieje od jakiegoś czasu. Jednak nie wszyscy będą korzystać z tego systemu; Nawet sterowniki i inni twórcy oprogramowania niskiego poziomu rzadko go używają. Ponieważ to czytasz, oznacza to, że chcesz dowiedzieć się więcej o systemie kompilacji jądra.
W ten sposób omówimy, w jaki sposób jądro zostanie skompilowane i omówimy system KBuild i KcConfig, abyś mógł je lepiej zrozumieć.
Makefile jądra ma pięć podstawowych elementów:
https: // elixir.bootlin.com/linux/najnowsze/źródło/scenariusze/kbuild.włączać
Kconfig
Plik KCONFIG zawiera moduły, które pomagają podczas korzystania z konfiguracji Make *. Pomaga jądrze dokonywać selektywnych konfiguracji, tworząc modułowość i możliwość dostosowywania procesu kompilacji jądra.
Istnieją różne cele konfiguracyjne określone przez system KCONFIG. Możesz użyć pomocy, aby wyświetlić dostępne cele. Te cele są przetwarzane przez różne programy dostarczane przez jądro podczas procesu kompilacji.
Niektóre cele KCONFIG obejmują:
Uczyń Linux-Windriver.Menuconfig - wykonuje menuconfig w oddzielnej sesji terminalowej.
Uczyń Linux-Windriver.Gconfig
Uczyń Linux-Windriver.xconfig
NOTATKA: Aby korzystać z GCONFIG i XCONFIG, powinieneś mieć instalowane narzędzia programistyczne QT w systemie hosta.
Rozważ następujące:
Migawka kodu defconfig z następującego zasobu:
https: // elixir.bootlin.com/linux/v5.9/Source/Scripts/kconfig/Makefile#L98
1. defconfig: $ (obj)/conf
2. ifneq ($ (WildCard $ (srctree)/arch/$ (srcarch)/configs/$ (kBuild_Defconfig)),)
3. @$ (kecho) "*** Domyślna konfiguracja jest oparta na„ $ (kBuild_DefConfig) '"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. w przeciwnym razie
6. @$ (kecho) "*** Domyślna konfiguracja jest oparta na celu„ $ (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 = $ (WildCard $ (srctree)/jądro/configs/$@ $ (srctree)/arch/$ (srcarch)/configs/$@)
14.
15. %.config: $ (obj)/conf
16. $ (if $ (call configfiles) ,, $ (błąd nie istnieje konfiguracja dla tego celu w tej architekturze))))
17. $ (Q) $ (config_shell) $ (srctree)/scripts/kconfig/merge_config.sh -m .config $ (configFiles)
18. $ (Q) $ (make) -f $ (srctree)/Makefile Olddefconfig
Migawka kodu oldconfig z następującego zasobu:
https: // elixir.bootlin.com/linux/v5.9/Source/Scripts/Kconfig/Conf.C#L694
1. Case Olddefconfig:
2. domyślny:
3. przerwa;
4.
5.
6. if (input_mode == savedefconfig)
7. if (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, „n *** błąd podczas zapisywania defconfig do: %s \ n \ n”,
9. defconfig_file);
10. zwrot 1;
11.
12. else if (input_mode != ListNeWConfig && input_mode != helpNewconfig)
13. Jeśli (!no_conf_write && conf_write (null))
14. fprintf (stderr, „\ n *** Błąd podczas pisania konfiguracji.\ n \ n ”);
15. wyjście (1);
16.
17.
18. /*
19. * Utwórz automatyczne.Conf, jeśli nie istnieje.
20. * To uniemożliwia GNU wykonanie 4.1 lub starsze od emitowania
21. * „Uwzględnij/config/auto.Conf: brak takiego pliku lub katalogu ”
22. * W najwyższym poziomie Makefile
23. *
24. * Syncconfig zawsze tworzy lub aktualizuje automatyczne.konfort, ponieważ tak jest
25. * Używany podczas kompilacji.
26. */
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (Stderr,
29. „\ n *** Błąd podczas synchronizacji konfiguracji.\ n \ n ”);
30. zwrot 1;
31.
32.
33. powrót 0;
34.
Istnieje wiele celów w systemie KCONFIG. Niektóre typowe obejmują Config i Menuconfig.
Jak wspomniano, cele są przetwarzane przez różne programy w systemach hosta, zapewniając GUI lub wiersz poleceń. Narzędzia KCONFIG można znaleźć w /skrypty /kconfig w źródle jądra.
https: // elixir.bootlin.com/linux/najnowsze/źródło/scenariusze/kconfig
https: // elixir.bootlin.com/linux/najnowsze/źródło/scenariusze/kconfig/makefile
Pierwszym procesem jest zazwyczaj odczytanie pliku KCONFIG w katalogu głównym, który służy do tworzenia początkowej bazy danych konfiguracji. W trakcie procesu baza danych jest aktualizowana podczas czytania plików w następującej kolejności:
.konfigurator
/lib/modules/$ (shell, uname-r)/.konfigurator
/etc/jądro-config
/boot/config-$ (powłoka, uname-r)
Arch_defconfig
arch/$ (arch)/defconfig
.Plik konfiguracyjny jest następnie upuszczany do Syncconfig, który akceptuje .Plik konfiguracyjny jako wejście. Przetwarza pliki i pobiera pliki, które są następnie podzielone na różne kategorie, takie jak:
Pliki kBuild
Prawie wszystkie pliki jądra to kbuild Makefile, które korzystają z infrastruktury KBuild, która jest funkcją rekurencyjną. Recursive Make to sposób na użycie narzędzia Make jako polecenia w makefile. Rekurencja jest bardzo przydatna podczas kompilacji dużego projektu.
KBuild działa, odnosząc się do wszystkich plików, o których wspomnialiśmy w powyższej sekcji.
System KBuild buduje swoje komponenty za pomocą najlepszego Makefile, który zawiera arch Makefiles z nazwą Arch/$ (arch)/Makefile w plikach konfiguracyjnych. Rekurencyjnie schodzi do podkładów wywołujących tworzenie komponentów za pomocą procedur w skryptach/makefile.*. KBuild następnie buduje sąsiedni obiekt i łączy je z obiektami, tworząc vmlinux.
Aby dowiedzieć się więcej o składni używanej w kbuild Makefiles, zapoznaj się z dokumentacją.
Rozważ następujący skrypt.
https: // github.com/torvalds/linux/blob/master/scripts/link-vmlinux.cii
Pliki obiektów O używane do utworzenia vmlinux są najpierw skompilowane w odpowiednich wbudowanych .Pliki jako var kbuild_vmlinux_init, main, libs. Są one składane w Vmlinux.
https: // github.com/torvalds/linux/blob/master/scripts/Makefile.zbudować
Wniosek
W tym przewodniku przyjrzeliśmy się systemom KBUILD i KCONFIG w systemie kompilacji jądra i jak to działa. Jak wspomnieliśmy na początku samouczka, omawiane tematy są szerokie i nie mogą być omówione w jednym samouczku.