Для управління та зменшення цієї складності розробники програмного забезпечення організовують код у невеликі файли, що посилаються на певні модулі. Розробники можуть скомпілювати кожен з цих файлів окремо, а потім зв’язати їх, щоб створити остаточний виконуваний файл програмного забезпечення.
Прикладом цього є проекти C, що складаються з файлів вихідного коду в .c розширення та програмні інтерфейси в .h розширення. Кожен вихідний файл компілюється разом із файлами заголовків для створення. o об'єкти, пов'язані між собою за допомогою бібліотек, створюючи тим самим виконувані файли.
Для виконання цього процесу розробники програмного забезпечення використовують такі інструменти, як Make, для автоматизації процесу збірки та необхідних залежностей файлів. Make використовує Makefiles для управління поведінкою процесу компіляції.
Інструменти GNU Make містять набір правил та домовленостей, що використовуються для створення Make-файлів та зменшення складності в підвищенні ефективності.
У цьому підручнику ми конкретно обговоримо Linux Kernel Makefiles Kconfig і Kbuild.
Перш ніж розпочати, варто зауважити, що ця стаття не претендує на те, щоб навчити усьому про систему побудови ядра. Однак ми пропонуємо високорівневий огляд побудови образу та модулів vmlinux.
Якщо ви хочете отримати інформацію, яка виходить за рамки цього підручника, радимо отримати наступний ресурс для отримання кращої інформації:
https: // linkfy.to / goMakefilesDocs
https: // linkfy.to / gnuMake
Змінні файли ядра: огляд
Система побудови ядра, яку також називають системою налаштування, є важливим інструментом - для тих, хто цього потребує - який існує вже деякий час. Однак не всі будуть користуватися цією системою; навіть драйвери та інші розробники програмного забезпечення низького рівня рідко ним користуються. Оскільки ви читаєте це, це означає, що ви хочете дізнатися більше про систему побудови ядра.
Таким чином, ми обговоримо, як ядро збирається, і обговоримо систему Kbuild та Kconfig, щоб ви могли їх краще зрозуміти.
Ядро Makefile має п’ять основних компонентів:
- Makefile: Це верхній файл make, розміщений у вихідному корені.
- arch / $ (ARCH) Makefile: Це арковий Makefile; він діє як доповнення до верхнього Makefile.
- .конфігурація: Це файл конфігурації ядра.
- Сценарії / Makefile.*: Це визначає встановлені правила для всіх файлів kbuild Make.
- Kbuild Makefiles: Існує близько 500 kbuild Makefile, і їх не дуже легко прочитати. Розглянемо такий файл, як:
https: // еліксир.бутлін.com / linux / latest / source / scripts / Kbuild.включати
Kconfig
Файл Kconfig містить модулі, які допомагають використовувати конфігурацію make *. Це допомагає ядру робити вибіркові конфігурації, створюючи модульність та настроюваність для процесу побудови ядра.
Існують різні цілі конфігурації, визначені системою Kconfig. Ви можете використовувати довідку make, щоб переглянути доступні цілі. Ці цілі обробляються різними програмами, наданими ядром під час процесу збірки.
Деякі цілі Kconfig включають:
- Налаштування: Це використовується для оновлення конфігураційного файлу ядра за допомогою лінійної програми.
- Menuconfig: Це функція або механізм Kconfig, який пропонує доступ до параметрів ядра на основі меню. Щоб запустити menuconfig та інші функції Kconfig, ви повинні бути всередині каталогу проекту платформи. Ви можете використовувати наступне, щоб запустити функцію Kconfig menuconfig. Однак ви також можете запустити menuconfig з іншими функціями конфігурації ядра Linux, такими як xconfig та gconfig. зробити linux-windriver.menuconfig - виконує menuconfig в окремому сеансі терміналу.
- gconfig та xconfig: Gconfig активує функції ядра Linux на основі графічного інтерфейсу. Gconfig використовує інтерфейс користувача на основі GTK або (на основі X). З іншого боку, Xconfig використовує інтерфейс на основі Qt. Використовуйте такі команди для запуску gconfig та xconfig відповідно:
зробити linux-windriver.xconfig
ПРИМІТКА: Щоб використовувати gconfig та xconfig, вам слід встановити засоби розробки QT в хост-системі.
- Nconfig: Функція Nconfig запускає поточну конфігурацію (Buildtools) і застосовується до програми Ncurses, керованої меню. Це дозволяє вибрати пакети для побудови, такі як процесор, драйвери та файлова система під час побудови ядра. Скористайтеся командою: make nconfig.
- Oldconfig: Функція oldconfig дозволяє застосовувати новіші .конфігураційні файли до старих файлів конфігурації ядра. Наприклад, старий .файл конфігурації та новіший .файл конфігурації (нова версія ядра) матиме відмінності, тобто перед оновленням ядра вам потрібно оновити поточну конфігурацію. Ви можете використовувати 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) / ядро / 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. if (input_mode == savedefconfig)
7. if (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Помилка під час збереження defconfig у:% s \ n \ n",
9. defconfig_file);
10. повернення 1;
11.
12. інакше якщо (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.
Як вже згадувалося, цілі обробляються різними програмами в хост-системах, надаючи або графічний інтерфейс, або командний рядок. Ви можете знайти інструменти Kconfig у / scripts / Kconfig у джерелі ядра.
https: // еліксир.бутлін.com / linux / latest / source / scripts / kconfig
https: // еліксир.бутлін.com / linux / latest / source / scripts / kconfig / Makefile
Перший процес, як правило, полягає у читанні файлу Kconfig у кореневому каталозі, який використовується для побудови початкової бази даних конфігурації. По мірі продовження процесу база даних оновлюється при читанні файлів у наступному порядку:
.конфігурація/ lib / modules / $ (оболонка, uname-r) /.конфігурація
/ etc / kernel-config
/ boot / config - $ (оболонка, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.Потім файл конфігурації скидається до syncconfig, який приймає файл .конфігураційний файл як вхідний. Він обробляє файл і виводить файли, які потім класифікуються на різні категорії, такі як:
- autoconf.h: Це використовується для вихідних файлів мови C.
- авто.конф і тристат.конф: Вони використовуються для обробки тексту Makefile.
- / включає / конфігурацію: Це порожні файли заголовків, що використовуються для відстеження залежностей.
Файли Kbuild
Майже всі файли ядра - це файли Kbuild Makefiles, які використовують інфраструктуру Kbuild, що є рекурсивною функцією створення. Рекурсивний Make - це спосіб використання інструмента Make як команди у файлі Make. Рекурсія дуже корисна при складанні великого проекту.
Kbuild працює, посилаючись на всі файли, про які ми згадали у вищевказаному розділі.
Система Kbuild створює свої компоненти, використовуючи верхній файл Makefile, що включає аркові файли MakeFile з ім'ям arch / $ (ARCH) / Makefile у файлах конфігурації. Він рекурсивно опускається в підкаталоги, що викликають Make на компонентах, використовуючи підпрограми у скриптах / Makefile.*. Потім Kbuild будує на сусідньому об’єкті та зв’язує їх у об’єкти, створюючи vmlinux.
Щоб дізнатися більше про синтаксис, який використовується у Kbuild Makefiles, зверніться до документації.
Розглянемо наступний сценарій.
https: // github.com / torvalds / linux / blob / master / scripts / link-vmlinux.ш
Файли об'єктів o, що використовуються для створення vmlinux, спочатку компілюються у відповідних вбудованих файлах .файли як var KBUILD_VMLINUX_INIT, MAIN, LIBS. Вони складаються у vmlinux.
https: // github.com / torvalds / linux / blob / master / scripts / Makefile.побудувати
Висновок
У цьому посібнику ми розглянули системи Kbuild і Kconfig в системі побудови ядра та їх роботу. Як ми вже згадували на початку підручника, обговорювані теми є широкими і не можуть бути висвітлені в одному підручнику.