International conference of developers
and users of free / open source software

Ускорение загрузки Linux на ARM процессоре

Андрей Пушкин, Минск, Belarus

LVEE Winter 2013

Speeding up Linux loading on ARM SOC is considered. Steps to speed up loading Linux on ARM board: review boot scheme (initramfs, no initramfs, filesystems, user space soft) and check loading time of all booting parts; customize pre-bootloader (on ARM TI AM3517 CPU is X-Load), turn off any console output, customize memory timings; customize bootloader (U-Boot), turn off any unused peripheral, rewrite some slow places; customize Linux kernel, turn off all unused options, move everything else to modules that come later; customize user space soft, loading GUI prior to other soft.

Перед автором была поставлена задача максимально ускорить процесс загрузки устройства с embedded Linux. Был предложен следующий план работы:

  1. Изучение работы системы и разбиениее ее на отдельные части для последующей оптимизации.
  2. Измерение времени загрузки каждого компонента системы. Для измерения использовались вывод отладочных сообщений в UART с засеканием времени их появления на Host-PC.
  3. Оптимизация времени загрузки каждого компонента.
  4. Измерение времени работы оптимизированной системы, фиксация результатов.
    Изначальное время загрузки устройства составляло 48 секунд. Исходным требованием было сократить время загрузки минимум до 5 секунд.

Устройство имело следующую конфигурацию:

  1. Процессор Texas Instruments AM3505 (600 Mhz Cortex-A8)
  2. 128 MB LPDDR2 RAM
  3. 256 MB NAND
  4. Touchscreen 320×240
  5. USB Host, USB Device, MMC, Bluetooth

В начале работы система была разбита на модули и было измерено время загрузки каждого из них. Данные оказались следующими:

  1. X-Load - 200 миллисекунд
  2. U-Boot - 15050 миллисекунд
  3. Linux - 9200 миллисекунд
  4. User Space Soft – 22000 миллисекунд
X-Load – предварительный загрузчик

В момент разработки проекта был актуален, сейчас x-load интегрирован в U-Boot и называется SPL1.
Из X-Load было вырезано всё, что связано с отладочным UART. Это дало выигрыш в 150 миллисекунд.

U-Boot – загрузчик ядра операционной системы

В U-Boot были сделаны следующие оптимизации:

  1. Изменение алгоритма загрузки
    – Отказ от Initramfs. Суть Initramfs заключается что что Linux + rootfs читаются из NAND одним образом.
    – Возврат к классической схеме загрузки, когда u-boot читает только маленький образ ядра операционной системы без rootfs-программ.
    Это дало выигрыш в 7300 миллисекунд.
  2. Отказ от подсчёта CRC в образе ядра Linux (в файле uImage). По-умолчанию U-boot считает контрольную сумму, и если она не совпадает с тем, что записано в uImage – не загружает его. Отказ от этой схемы привел к тому, что u-boot всегда загружает ядро Linux, и дал выигрыш в 1200 миллисекунд.
  3. Уменьшение размера ядра Linux путём вынесения всего, что можно, в модули, которые загружаются позже. Это позволило уменьшить ядро Linux и значительно ускорить его чтение. Выигрыш составил 600 миллисекунд.
  4. Включение аппаратного NAND ECC дало выигрыш в 200 миллисекунд.
  5. Удаление инициализации из U-Boot неиспользуемых частей: I2C, SPI, USB Host, USB device, MMC, драйверов ext2-3, VFAT дало выигрыш в 700 миллисекунд.
  6. Встраивание картинки «Loading» (чтобы показать, что прибор загружается) в образ U-boot взамен считывания ее картинки с NAND-памяти дало выигрыш в 100 миллисекунд.
  7. Переписывание memmove под Cortex-A8. Это дало выигрыш в 2250 миллисекунд
    Всё в сумме привело к времени загрузки в 3000 миллисекунд вместо 15050.
Оптимизация Linux.

Были сделаны следующие оптимизации:

  1. Удаление из конфига ядра инициализации всего «лишнего» (ненужные драйвера, отладочные опции и так далее). Это дало выигрыш в 100 миллисекунд
  2. Вынесение всего, что возможно, в модули, которые загружаются позже. Это дало выигрыш в 8150 миллисекунд.
    Всё в сумме дало время загрузки в 1050 миллисекунд вместо 9200.
Оптимизация User Space

Схема загрузки до оптимизации включала следующие этапы:

  1. Ядро Linux
  2. Init скрипты
  3. Монтирование раздела с настройками
  4. Монтирование раздела с данными
  5. Запуск Qt4 GUI программы.

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

В результате получилась следующая схема загрузки:

  1. Ядро Linux
  2. Qt4 GUI (не блокирующий запуск)
  3. Init скрипты
  4. Загрузка модулей ядра Linux
  5. Монтирование раздела с данными
  6. запуск Qt4 GUI программы

Также в ходе оптимизации было сделано следующее:

  1. Перед запуском графической Qt4-программы ставится её скриношот. Сама программа запускается 1500 миллисекунд.
  2. Файловая система заменена с JFFS2 на UBI, что дало выигрыш 5-10 секунд на монтировании
  3. Графическая Qt4-программа переписана таким образом, чтобы сначала загружались те её части, которые отвечают за главное меню, и лишь потом – всё остальное

В ходе работы были получены результаты:

  1. Показ меню прибора за 5 секунд
  2. Показ графического ПО за 6.5 секунд
  3. Полная загрузка прибора за 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