- Вопрос или проблема
- С отключенным sh
- Ответ или решение
- 1. Используйте меню конфигурации ядра (make menuconfig)
- 2. Отключение компонента, потребляющего много ресурсов
- 3. Настройка параметров ядра через загрузчик
- 4. Анализ памяти с помощью инструмента readelf
- 5. Непрерывное тестирование и сборка
- 6. Анализ результатов
- Дополнительные рекомендации:
Вопрос или проблема
Я работаю над встроенной системой 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.
Вот он.
-
Следуйте нормальному и общему способу запуска
make menuconfig
, чтобы просмотреть множество конфигураций и отключить то, что НЕ используется/необходимо, этобезрисковый
способ.
Не забудьте собрать и загрузить ядро, чтобы проверить, работает ли изменение так, как ожидалось. -
Отключите компоненты ядра, которые сильно занимают память, такие как
sysfs
,procfs
иprintk
. Это изменение значительно уменьшит размер ядра, но некоторые функции могут перестать работать, такие какfree
,ps
,mount
, которые сильно зависят отprocfs
. Поэтому это компромисс между объемом памяти и функциями. -
Настройте параметры ядра в загрузчике, чтобы отключить или установить некоторые функции ядра, чтобы использовать меньше памяти.
-
Используйте
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 и подготовить систему для функционирования на ограниченном аппарате.