Чтобы управлять этой сложностью и уменьшить ее, разработчики программного обеспечения организуют код в небольшие файлы, которые связаны с конкретными модулями. Разработчики могут скомпилировать каждый из этих файлов отдельно, а затем связать их вместе, чтобы создать окончательный исполняемый файл программного обеспечения.
Примером этого являются проекты C, состоящие из файлов исходного кода в .c расширений и программных интерфейсов в .h расширения. Каждый исходный файл компилируется вместе с файлами заголовков для создания. o объекты, связанные вместе с помощью библиотек, тем самым создавая исполняемые файлы.
Для выполнения этого процесса разработчики программного обеспечения используют такие инструменты, как Make, для автоматизации процесса сборки и необходимых зависимостей файлов. Make использует Makefiles для управления поведением процесса компиляции.
Инструменты GNU Make предоставляют набор правил и соглашений, используемых для создания Make-файлов, и упрощают повышение эффективности.
В этом руководстве мы обсудим Makefiles ядра Linux, в частности Kconfig а также Kbuild.
Прежде чем мы начнем, стоит отметить, что эта статья не претендует на то, чтобы научить все о системе сборки ядра. Тем не менее, мы предоставляем общий обзор создания образа и модулей vmlinux.
Если вам нужна информация, выходящая за рамки этого руководства, мы рекомендуем следующий ресурс для получения более подробной информации:
https: // linkfy.в / goMakefilesDocs
https: // linkfy.в / gnuMake
Makefiles ядра: обзор
Система сборки ядра, также называемая системой конфигурации, является важным инструментом для тех, кто в ней нуждается, и который существует уже некоторое время. Однако не все будут использовать эту систему; даже драйверы и другие разработчики низкоуровневого ПО редко используют его. Раз вы читаете это, значит, вы хотите узнать больше о системе сборки ядра.
Таким образом, мы обсудим, как компилируется ядро, и обсудим систему Kbuild и Kconfig, чтобы вы могли лучше их понять.
Makefile ядра состоит из пяти основных компонентов:
- Makefile: Это верхний make-файл, расположенный в корне исходного кода.
- arch / $ (ARCH) Makefile: Это архива Makefile; он действует как дополнение к верхнему Makefile.
- .config: Это файл конфигурации ядра.
- Скрипты / Makefile.*: Это определяет установленные правила для всех Make-файлов kbuild.
- Kbuild Makefiles: Существует около 500 сборочных файлов Makefile, и их не очень легко читать. Рассмотрим такой файл, как:
https: // эликсир.бутлин.com / linux / последний / источник / скрипты / Kbuild.включать
Kconfig
Файл Kconfig содержит модули, которые помогают при использовании make * config. Это помогает ядру производить выборочные конфигурации, создавая модульность и настраиваемость для процесса сборки ядра.
Система 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 позволяет применять более новые .config файлы в старые файлы конфигурации ядра. Например, старый .config и новее .config (более новая версия ядра) будет иметь отличия, то есть вам необходимо обновить текущую конфигурацию перед сборкой ядра. Вы можете использовать make oldconfig для интерактивного обновления старой конфигурации, применяя параметры, отсутствующие в старом файле конфигурации.
- Defconfig: Эта функция позволяет системе сборки ядра добавлять новую конфигурацию, предоставленную defconfig, в .файл конфигурации. Точнее система Kbuild проверяет все файлы Kconfig. Если defconfig указывает параметр в файле, система Kbuild использует указанное значение для добавления параметра в .config. Если defconfig не упоминает эту опцию, Kbuild использует значения по умолчанию в .config.
Учтите следующее:
Снимок кода Defconfig со следующего ресурса:
https: // эликсир.бутлин.com / linux / v5.9 / источник / сценарии / 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) $ (СДЕЛАТЬ) -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. $ (если $ (call configfiles) ,, $ (ошибка Нет конфигурации для этой цели в этой архитектуре))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / scripts / kconfig / merge_config.ш-м .config $ (файлы конфигурации)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Снимок кода Oldconfig со следующего ресурса:
https: // эликсир.бутлин.com / linux / v5.9 / источник / сценарии / kconfig / conf.с # 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 год. * "include / config / auto.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: Это правило сохраняет текущий .config в виде ./ defconfig, который рассматривается как минимальный файл конфигурации. Используйте команду: make savedefconfig
- Listnewconfig: Используется для вывода списка новых опций.
- Kvmconfig: Это включает параметры для поддержки KVM. Используйте команду: make kvm_guest.config
- Allyesconfig: Это создает новый файл конфигурации ядра со всеми параметрами, установленными на да. Это противоположность allnoconfig.
- Allmodconfig: Это создает новую конфигурацию ядра, с которой модули включены по умолчанию.
- Randconfig: Это создает новый файл конфигурации ядра со случайными ответами на все параметры.
- Tinyconfig: Это делает возможным самое маленькое ядро.
В системе Kconfig много целей. Некоторые общие включают config и menuconfig.
Как уже упоминалось, цели обрабатываются различными программами в хост-системах, предоставляя графический интерфейс или командную строку. Вы можете найти инструменты Kconfig в / scripts / Kconfig в исходном коде ядра.
https: // эликсир.бутлин.com / linux / последний / источник / скрипты / kconfig
https: // эликсир.бутлин.com / linux / последний / источник / сценарии / kconfig / Makefile
Первый процесс обычно заключается в чтении файла Kconfig в корневом каталоге, который используется для создания исходной базы данных конфигурации. По мере продолжения процесса база данных обновляется при чтении файлов в следующем порядке:
.config/ lib / modules / $ (оболочка, uname-r) /.config
/ и т.д. / ядро-конфигурация
/ boot / config - $ (оболочка, uname-r)
ARCH_DEFCONFIG
арка / $ (ARCH) / defconfig
.config затем удаляется в syncconfig, который принимает .файл конфигурации в качестве ввода. Он обрабатывает файл и выводит файлы, которые затем классифицируются по различным категориям, например:
- autoconf.час: Используется для исходных файлов на языке C.
- авто.conf и с тремя состояниями.conf: Они используются для обработки текста Makefile.
- / включает / config: Это пустые файлы заголовков, используемые при отслеживании зависимостей.
Файлы Kbuild
Почти все файлы ядра - это файлы Kbuild Makefile, использующие инфраструктуру Kbuild, которая является рекурсивной функцией make. Рекурсивный Make - это способ использования инструмента Make в качестве команды в Makefile. Рекурсия очень полезна при компиляции большого проекта.
Kbuild работает, ссылаясь на все файлы, упомянутые в предыдущем разделе.
Система Kbuild собирает свои компоненты, используя верхний Makefile, который включает в себя Arch Makefile с именем arch / $ (ARCH) / Makefile в файлах конфигурации. Он рекурсивно спускается в подкаталоги, вызывая Make для компонентов, используя процедуры в скриптах / Makefile.*. Затем Kbuild опирается на соседний объект и связывает их в объекты, создавая vmlinux.
Чтобы узнать больше о синтаксисе, используемом в Kbuild Makefiles, обратитесь к документации.
Рассмотрим следующий сценарий.
https: // github.ком / torvalds / Linux / blob / мастер / скрипты / ссылка-vmlinux.ш
Объектные файлы o, используемые для создания vmlinux, сначала компилируются в соответствующие встроенные .a файлы как var KBUILD_VMLINUX_INIT, MAIN, LIBS. Они составлены в vmlinux.
https: // github.com / torvalds / linux / blob / мастер / скрипты / Makefile.строить
Заключение
В этом руководстве мы рассмотрели системы Kbuild и Kconfig в системе сборки ядра и как они работают. Как мы упоминали в начале руководства, обсуждаемые темы обширны и не могут быть рассмотрены в одном учебном пособии.