За да управляват и намаляват тази сложност, разработчиците на софтуер организират код в малки файлове, които се свързват към определени модули. Разработчиците могат да компилират всеки от тези файлове поотделно и след това да ги свържат заедно, за да създадат окончателен изпълним софтуер.
Пример за това са C проекти, съставени от файлове с изходен код в .c разширения и софтуерни интерфейси в .h разширения. Всеки изходен файл се компилира заедно със заглавните файлове за създаване. o обекти, свързани заедно чрез библиотеки, като по този начин създават изпълними файлове.
За да изпълнят този процес, разработчиците на софтуер използват инструменти като Make, за да автоматизират процеса на изграждане и необходимите файлови зависимости. Make използва Makefiles за управление на поведението на процеса на компилация.
Инструментите GNU Make предоставят набор от правила и конвенции, използвани за създаване на Makefile и намаляване на сложността при подобряване на ефективността.
В този урок ще обсъдим конкретно Linux Kernel Makefiles Kconfig и Kbuild.
Преди да започнем, добре е да отбележим, че тази статия не претендира да преподава всичко за системата за изграждане на ядрото. Ние обаче предоставяме общ преглед на високо ниво за изграждане на vmlinux образ и модули.
Ако искате информация извън обхвата на този урок, препоръчваме следния ресурс за по-добра информация:
https: // linkfy.към / goMakefilesDocs
https: // linkfy.към / gnuMake
Профили на ядрото: Общ преглед
Системата за изграждане на ядро, наричана още конфигурационна система, е основен инструмент - за тези, които се нуждаят - който съществува от известно време. Не всеки обаче ще използва тази система; дори драйверите и други разработчици на софтуер от ниско ниво рядко го използват. Тъй като четете това, това означава, че искате да научите повече за системата за изграждане на ядрото.
По този начин ще обсъдим как се компилира ядрото и ще обсъдим системата Kbuild и Kconfig, за да можете да ги разберете по-добре.
Kernel Makefile има пет основни компонента:
- Makefile: Това е най-добрият файл за създаване, намиращ се в изходния корен.
- arch / $ (ARCH) Makefile: Това е арката Makefile; той действа като допълнение към най-добрия Makefile.
- .конфиг: Това е конфигурационният файл на ядрото.
- Скриптове / Makefile.*: Това дефинира зададени правила за всички kbuild Makefiles.
- Kbuild Makefiles: Има около 500 kbuild Makefiles и те не са много лесни за четене. Помислете за файл като:
https: // еликсир.обувка.com / linux / latest / source / scripts / Kbuild.включва
Kconfig
Файлът Kconfig съдържа модули, които помагат при използване на конфигурацията make *. Той помага на ядрото да прави селективни конфигурации, създавайки модулност и адаптивност за процеса на изграждане на ядрото.
Има различни конфигурационни цели, посочени от системата Kconfig. Можете да използвате помощната помощ за преглед на наличните цели. Тези цели се обработват от различни програми, предоставени от ядрото по време на процеса на изграждане.
Някои от целите на Kconfig включват:
- Конфигурация: Това се използва за актуализиране на конфигурационния файл на ядрото с помощта на линейната програма.
- Menuconfig: Това е функция или механизъм на Kconfig, които предлагат базиран на менюто достъп до опциите на ядрото. За да стартирате menuconfig и други функции на Kconfig, трябва да сте в директорията на проекта на платформата. Можете да използвате следното, за да стартирате функцията Kconfig menuconfig. Можете обаче да стартирате menuconfig с други функции за конфигуриране на ядрото на GUI Linux, като xconfig и gconfig. направете linux-windriver.menuconfig - изпълнява menuconfig в отделна терминална сесия.
- gconfig и xconfig: Gconfig активира базирани на GUI функции на Linux Kernel. Gconfig използва GTK или (базиран на X) потребителски интерфейс. От друга страна, Xconfig използва Qt-базиран потребителски интерфейс. Използвайте следните команди, за да стартирате съответно gconfig и xconfig:
направете linux-windriver.xconfig
ЗАБЕЛЕЖКА: За да използвате gconfig и xconfig, трябва да имате инсталирани QT инструменти за разработка на хост системата.
- Nconfig: Функцията Nconfig изпълнява текущата конфигурация (Buildtools) и се прилага за програмата, управлявана от менюто Ncurses. Това ви позволява да избирате пакетите за изграждане, като CPU, драйвери и файлова система при изграждането на ядрото. Използвайте командата: make nconfig.
- Oldconfig: Функцията oldconfig ви позволява да прилагате по-нови .конфигурационни файлове към по-стари конфигурационни файлове на ядрото. Например стар .конфигурационен файл и по-нова .config файлът (по-нова версия на ядрото) ще има разлики, което означава, че трябва да актуализирате текущата конфигурация преди изграждането на ядрото. Можете да използвате make oldconfig, за да актуализирате старата конфигурация интерактивно, като приложите опции, липсващи в стария конфигурационен файл.
- Defconfig: Тази функция позволява на системата за изграждане на ядрото да добавя нова конфигурация, предоставена от defconfig към .конфигурационен файл. По-точно системата Kbuild проверява всички файлове Kconfig. Ако defconfig посочи опция във файла, системата Kbuild използва определената стойност, за да добави опцията към .конфиг. Ако defconfig не споменава опцията, Kbuild използва стойности по подразбиране в .конфиг.
Помислете за следното:
Снимка на кода на Defconfig от следния ресурс:
https: // еликсир.обувка.com / linux / v5.9 / source / scripts / kconfig / Makefile # L98
1. defconfig: $ (obj) / conf2. ifneq ($ (заместващ $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Конфигурацията по подразбиране се основава на '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. друго
6. @ $ (kecho) "*** Конфигурацията по подразбиране се основава на целта '$ (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 = $ (заместващ $ (srctree) / kernel / configs / $ @ $ (srctree) / arch / $ (SRCARCH) / configs / $ @)
14.
15. %.конфиг: $ (obj) / conf
16. $ (ако $ (извиква конфигурационни файлове) ,, $ (грешка Не съществува конфигурация за тази цел на тази архитектура))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / scripts / kconfig / merge_config.ш-м .config $ (configfiles)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Снимка на кода на Oldconfig от следния ресурс:
https: // еликсир.обувка.com / linux / v5.9 / source / scripts / kconfig / conf.c # L694
1. case olddefconfig:2. по подразбиране:
3. почивка;
4.
5.
6. ако (input_mode == savedefconfig)
7. ако (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Грешка при запазване на defconfig в:% s \ n \ n",
9. defconfig_file);
10. връщане 1;
11.
12. else if (input_mode != listnewconfig && input_mode != helpnewconfig)
13. ако (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Грешка по време на писане на конфигурацията.\ n \ n ");
15. изход (1);
16.
17.
18. / *
19. * Създаване на автоматично.conf, ако не съществува.
20. * Това предотвратява GNU Make 4.1 или повече от излъчване
21. * "включва / конфигурация / автоматично.conf: Няма такъв файл или директория "
22. * в Makefile от най-високо ниво
23. *
24. * syncconfig винаги създава или актуализира автоматично.conf, защото е така
25. * използвано по време на компилацията.
26. * /
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Грешка по време на синхронизиране на конфигурацията.\ n \ n ");
30. връщане 1;
31.
32.
33. връщане 0;
34.
- Savedefconfig: Това правило запазва текущата .конфиг под формата на ./ defconfig, който се разглежда като минимален конфигурационен файл. Използвайте командата: make savedefconfig
- Listnewconfig: Това се използва за изброяване на нови опции.
- Kvmconfig: Това дава възможност за поддръжка на KVM. Използвайте командата: make kvm_guest.конфиг
- Allyesconfig: Това изгражда нов конфигурационен файл на ядрото с всички опции, зададени на да. Това е обратното на allnoconfig.
- Allmodconfig: Това изгражда нова конфигурация на ядрото, с която модулите са активирани по подразбиране.
- Randconfig: Това изгражда нов конфигурационен файл на ядрото с произволни отговори на всички опции.
- Tinyconfig: Това прави възможно най-малкото ядро.
В системата Kconfig има много цели. Някои често срещани включват config и menuconfig.
Както бе споменато, целите се обработват от различни програми в хост системите, като предоставят GUI или команден ред. Можете да намерите инструментите на Kconfig в / scripts / Kconfig в източника на ядрото.
https: // еликсир.обувка.com / linux / latest / source / scripts / kconfig
https: // еликсир.обувка.com / linux / latest / source / scripts / kconfig / Makefile
Първият процес обикновено е да се прочете файлът Kconfig в основната директория, който се използва за изграждане на първоначална база данни за конфигуриране. Тъй като процесът продължава, базата данни се актуализира при четене на файлове в следния ред:
.конфиг/ lib / модули / $ (черупка, uname-r) /.конфиг
/ etc / kernel-config
/ boot / config - $ (черупка, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.След това конфигурационният файл се изпуска в syncconfig, който приема .конфигурационен файл като вход. Той обработва файла и извежда файлове, които след това се класифицират в различни категории като:
- autoconf.ч: Това се използва за изходни файлове на езика C.
- Автоматичен.conf и tristate.conf: Те се използват за обработка на текст на Makefile.
- / включва / конфигурация: Това са празни заглавни файлове, използвани при проследяване на зависимости.
Kbuild файлове
Почти всички файлове на ядрото са Kbuild Makefiles, които използват инфраструктурата на Kbuild, което е рекурсивна функция за създаване. Recursive Make е начин за използване на инструмента Make като команда в Makefile. Рекурсията е много полезна при съставяне на голям проект.
Kbuild работи, като се позовава на всички файлове, които споменахме в горния раздел.
Системата Kbuild изгражда своите компоненти, използвайки най-добрия Makefile, който включва сводните Makefiles с името arch / $ (ARCH) / Makefile в конфигурационните файлове. Той рекурсивно се спуска в поддиректории, извикващи Make на компонентите, използвайки рутините в скриптове / Makefile.*. След това Kbuild надгражда съседния обект и ги свързва в обекти, създавайки vmlinux.
За да научите повече за синтаксиса, използван в Kbuild Makefiles, вижте документацията.
Обмислете следния скрипт.
https: // github.com / torvalds / linux / blob / master / scripts / link-vmlinux.ш
Файловете o o, използвани за създаване на vmlinux, се компилират първо в съответните им вградени .файлове като var KBUILD_VMLINUX_INIT, MAIN, LIBS. Те са съставени във vmlinux.
https: // github.com / torvalds / linux / blob / master / scripts / Makefile.изграждане
Заключение
В това ръководство разгледахме системите Kbuild и Kconfig в системата за изграждане на ядро и как работи. Както споменахме в началото на урока, обсъжданите теми са широки и не могат да бъдат обхванати в един урок.