Что нужно сделать, чтобы сгенерировать минимальное ядро Linux?

Вопрос или проблема

Я работаю над встроенной системой Linux (5.10.24), и теперь хочу проверить, какой минимальный ядро я могу собрать, поэтому после множества экспериментов с конфигурациями ядра у меня есть следующее ядро.

# dmesg | grep 'Memory:'
Память: 12620K/16384K доступно (1933K код ядра, 128K rwdata, 236K rodata, 192K init, 55K bss, 3764K зарезервировано, 0K cma-зарезервировано)

# free
              всего       использовано      свободно     общий   buff/cache   доступно
Память:      12812        2624            8808           0       1380        8928
Подкачка:        0           0           0

Я отключил некоторые критические коды ядра, такие как sysfs и драйверы.
Поэтому в настоящее время я не могу оптимизировать конфигурацию ядра, чтобы снизить использование памяти ядром.

Это нормальное ядро, работающее на MPU с MMU, на данный момент я не могу перейти на uCLinux.

Далее я могу вручную изменить код, отключив или упростив коды ядра. Но прежде чем я это сделаю, я сначала хочу сузить круг функций ядра, которые используют больше памяти, чем другие.

Так что есть ли какие-либо советы, на каких кодах мне сосредоточиться в первую очередь? И есть ли какой-либо инструмент, который поможет мне понять, какая часть ядра занимает больше памяти, на которую мне следует обратить внимание?

Я нашел свой способ создания минимального ядра Linux.
Вот он.

  1. Следуйте нормальному и общему способу запуска make menuconfig, чтобы просмотреть множество конфигураций и отключить то, что НЕ используется/необходимо, это безрисковый способ.
    Не забудьте собрать и загрузить ядро, чтобы проверить, работает ли изменение так, как ожидалось.

  2. Отключите компоненты ядра, которые сильно занимают память, такие как sysfs, procfs и printk. Это изменение значительно уменьшит размер ядра, но некоторые функции могут перестать работать, такие как free, ps, mount, которые сильно зависят от procfs. Поэтому это компромисс между объемом памяти и функциями.

  3. Настройте параметры ядра в загрузчике, чтобы отключить или установить некоторые функции ядра, чтобы использовать меньше памяти.

  4. Используйте readelf, чтобы проверить, какие функции и данные занимают память. Изменить коды ядра, чтобы упростить некоторые функции на основе конкретной аппаратной платформы, такой как количество IRQ и т. д.

Необходимо строить и тестировать образ ядра после каждого изменения.

С помощью проб и тестов я наконец получил образ ядра, как указано ниже,

-rw-rw-r-- 1 t    t      972961 Nov 29 22:09 vmlinuz

text    data     bss     dec     hex
1860928  242232   28032 2131192  2084f8

# free
              всего       использовано      свободно     общий   buff/cache   доступно
Память:       5620        2140            2188           0       1292        2660
Подкачка:        0           0           0

С отключенным sh

Согласно комментарию paladin, я попытался отключить ‘sh’ в ядре и сравнил результат.

Перед изменением.

text    data     bss     dec     hex
7905846 1791740  135872 9833458  960bf2

После изменения

text    data     bss     dec     hex
7905026 1787608  135872 9828506  95f89a

Итак, было сэкономлено около 800 байт в text и около 3 КБ в data.

Очень жаль, что нет онлайн-анализатора kconfig.

Я делаю нечто подобное для ПК, а не встроенного, и обнаруживаю, что могу создать tinyconfig для linux-4.2 на ~1000k; но затем мне нужно добавить такие функции, как; tiny+ipc, tiny+acpi, чтобы просто приостановить машину или запустить shell-скрипт (некоторые вещи слишком полезны).

Я почти могу собрать X, поэтому, в некотором роде, я хочу добавить функции, необходимые для libc, X и SSL, при этом все еще собирая небольшое x64 ядро.

Мне нужно перекомпилировать весь дистрибутив, когда изменяются заголовки ядра.

Ответ или решение

Чтобы разработать минимальный образ ядра Linux для встроенных систем, требуется учитывать множество факторов, включая оптимизацию конфигураций, выбор компонентов ядра и тестирование итогового результата. Ваша задача состоит в том, чтобы сузить область анализа, сосредоточив внимание на тех частях ядра, которые занимают наибольшее количество памяти. Вот шаги, которые помогут вам в этом процессе:

1. Используйте меню конфигурации ядра (make menuconfig)

Первый шаг в оптимизации ядра — это использование утилиты make menuconfig, которая позволяет легко настраивать параметры сборки. В этом интерфейсе вы сможете:

  • Отключить ненужные модули и функции, такие как драйвера оборудования, которые не будут использоваться в вашей системе.
  • Обеспечить «безопасные» изменения: сначала отключайте компоненты, которые уверенно можно исключить.

2. Отключение компонента, потребляющего много ресурсов

Некоторые из компонентов ядра, таких как sysfs, procfs и printk, могут занимать значительное количество оперативной памяти. Их отключение может сразу уменьшить вес ядра, но это также сопряжено с рисками — некоторые полезные функции (такие как команды free, ps, mount) могут перестать работать. Подходите к этому осторожно и внимательно тестируйте каждое изменение.

3. Настройка параметров ядра через загрузчик

Настройте параметры ядра, передаваемые через загрузчик, для отключения или снижения использования памяти определенными функциями. Это добавит дополнительный уровень контроля и может помочь в процессе снижения занимаемой памяти.

4. Анализ памяти с помощью инструмента readelf

Используйте утилиту readelf для анализа образа ядра. Этот инструмент позволит вам выявить функции и данные, которые занимают наиболее значительное количество памяти. Рекомендуется:

  • Упрощать функции в зависимости от характеристик вашего аппаратного обеспечения (например, количество прерываний).
  • Переписывать или оптимизировать код для достижения лучшей памяти.

5. Непрерывное тестирование и сборка

Процесс оптимизации ядра требует постоянного тестирования. Каждое изменение должно сопровождаться новой сборкой и проверкой работоспособности системы, чтобы гарантировать, что функция системы не пострадает в результате роста производительности.

6. Анализ результатов

Записывайте результаты новосозданных образов. Сравните размеры различных сегментов ядра (текст, данные, bss) до и после оптимизации. Например, в вашем случае размеры были:

  • До изменения: текст 7905846, данные 1791740.
  • После изменения: текст 7905026, данные 1787608. Это указывает на минимальную, но значимую экономию памяти.

Дополнительные рекомендации:

  • Рассмотрите возможность использования специализированных инструментов и утилит, таких как kconfig, для автоматизации некоторых процессов анализа конфигураций. Хотя универсального онлайн-анализатора не существует, вы можете найти множество ресурсов по этим утилитам.
  • Будьте готовы к тому, что некоторые функции могут потребовать дополнительных ресурсов, и фокусируйтесь на тех, которые критически важны для вашего проекта.

Соблюдая эти рекомендации, вы сможете успешно сократить объем используемой памяти ядром Linux и подготовить систему для функционирования на ограниченном аппарате.

Оцените материал
Добавить комментарий

Капча загружается...