Ускорение загрузки Linux на ARM процессоре
LVEE Winter 2013
Перед автором была поставлена задача максимально ускорить процесс загрузки устройства с embedded Linux. Был предложен следующий план работы:
- Изучение работы системы и разбиениее ее на отдельные части для последующей оптимизации.
- Измерение времени загрузки каждого компонента системы. Для измерения использовались вывод отладочных сообщений в UART с засеканием времени их появления на Host-PC.
- Оптимизация времени загрузки каждого компонента.
- Измерение времени работы оптимизированной системы, фиксация результатов.
Изначальное время загрузки устройства составляло 48 секунд. Исходным требованием было сократить время загрузки минимум до 5 секунд.
Устройство имело следующую конфигурацию:
- Процессор Texas Instruments AM3505 (600 Mhz Cortex-A8)
- 128 MB LPDDR2 RAM
- 256 MB NAND
- Touchscreen 320×240
- USB Host, USB Device, MMC, Bluetooth
В начале работы система была разбита на модули и было измерено время загрузки каждого из них. Данные оказались следующими:
- X-Load - 200 миллисекунд
- U-Boot - 15050 миллисекунд
- Linux - 9200 миллисекунд
- User Space Soft – 22000 миллисекунд
X-Load – предварительный загрузчик
В момент разработки проекта был актуален, сейчас x-load интегрирован в U-Boot и называется SPL1.
Из X-Load было вырезано всё, что связано с отладочным UART. Это дало выигрыш в 150 миллисекунд.
U-Boot – загрузчик ядра операционной системы
В U-Boot были сделаны следующие оптимизации:
- Изменение алгоритма загрузки
– Отказ от Initramfs. Суть Initramfs заключается что что Linux + rootfs читаются из NAND одним образом.
– Возврат к классической схеме загрузки, когда u-boot читает только маленький образ ядра операционной системы без rootfs-программ.
Это дало выигрыш в 7300 миллисекунд. - Отказ от подсчёта CRC в образе ядра Linux (в файле uImage). По-умолчанию U-boot считает контрольную сумму, и если она не совпадает с тем, что записано в uImage – не загружает его. Отказ от этой схемы привел к тому, что u-boot всегда загружает ядро Linux, и дал выигрыш в 1200 миллисекунд.
- Уменьшение размера ядра Linux путём вынесения всего, что можно, в модули, которые загружаются позже. Это позволило уменьшить ядро Linux и значительно ускорить его чтение. Выигрыш составил 600 миллисекунд.
- Включение аппаратного NAND ECC дало выигрыш в 200 миллисекунд.
- Удаление инициализации из U-Boot неиспользуемых частей: I2C, SPI, USB Host, USB device, MMC, драйверов ext2-3, VFAT дало выигрыш в 700 миллисекунд.
- Встраивание картинки «Loading» (чтобы показать, что прибор загружается) в образ U-boot взамен считывания ее картинки с NAND-памяти дало выигрыш в 100 миллисекунд.
- Переписывание memmove под Cortex-A8. Это дало выигрыш в 2250 миллисекунд
Всё в сумме привело к времени загрузки в 3000 миллисекунд вместо 15050.
Оптимизация Linux.
Были сделаны следующие оптимизации:
- Удаление из конфига ядра инициализации всего «лишнего» (ненужные драйвера, отладочные опции и так далее). Это дало выигрыш в 100 миллисекунд
- Вынесение всего, что возможно, в модули, которые загружаются позже. Это дало выигрыш в 8150 миллисекунд.
Всё в сумме дало время загрузки в 1050 миллисекунд вместо 9200.
Оптимизация User Space
Схема загрузки до оптимизации включала следующие этапы:
- Ядро Linux
- Init скрипты
- Монтирование раздела с настройками
- Монтирование раздела с данными
- Запуск Qt4 GUI программы.
В ходе оптимизации был убран раздел с настройками, которые стали хранится на основном разделе. Графическая программа на Qt4 начала запускаться как можно раньше чтобы показать меню программы как можно раньше, а остальные части загружать позднее.
В результате получилась следующая схема загрузки:
- Ядро Linux
- Qt4 GUI (не блокирующий запуск)
- Init скрипты
- Загрузка модулей ядра Linux
- Монтирование раздела с данными
- запуск Qt4 GUI программы
Также в ходе оптимизации было сделано следующее:
- Перед запуском графической Qt4-программы ставится её скриношот. Сама программа запускается 1500 миллисекунд.
- Файловая система заменена с JFFS2 на UBI, что дало выигрыш 5-10 секунд на монтировании
- Графическая Qt4-программа переписана таким образом, чтобы сначала загружались те её части, которые отвечают за главное меню, и лишь потом – всё остальное
В ходе работы были получены результаты:
- Показ меню прибора за 5 секунд
- Показ графического ПО за 6.5 секунд
- Полная загрузка прибора за 27 секунд
1 http://omappedia.org/wiki/U-boot_Upstreaming_Project#X-loader_up-streaming.28SPL.29_-_OMAP4
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Back