Как стать автором
Обновить

Заметки о восстановлении работы встраиваемых систем

Время на прочтение4 мин
Количество просмотров8K
Попытался собрать свой опыт портирования OpenWRT на встраиваемое оборудование. В этой статье расскажу о том как работать с загрузчиком u-boot и основных проблемах возникающих при загрузке операционной системы.


Работа с u-boot


Во встраиваемых нет отдельной платы BIOS'а, поэтому загрузчик(u-boot в нашем случае) находиться прямо на флешке. Поэтому нужно быть очень аккуратным при работе с флешкей, и не забывай сделать дамп загрузчика перед какими-либо опасными действиями! Так-же отмечу особенность NOR-флешек: ячейки накопителя представлены в виде оперативной памяти. Благодаря этому можно выполнять программы на лету — без копирования в память. В случае NAND-флешек используется специальные программы для записи. Итак у нас есть загрузчик, прямые руки и осознание того что нужно делать. Изучим вывод printenv в поисках алиасов которые нам могут сильно облегчить жизнь. Находим что-то типа этого:

kimage=${download} ${memtmp_addr} ${kimagename};run erase_kimage;cp.b ${memtmp_addr} ${kernel_addr} ${filesize}.

Разберу поподробнее что к чему здесь происходит. При запуске run kimage, выполниться download (по умолчанию download=tftp, можно поменять на nfs или serial line), файл загрузиться в адрес который записан в memtmp_addr, kimagename — равен vmlinux.gz.uImage ну и так далее по списку, переменные видны по printenv. После загрузки файла в оперативную память, запускается процесс стирания флешки и далее следует копирование файла из памяти на флешку. Отмечу что переменная filesize равна размеру последнего загруженного файла и заполнятся командой tftp в данном случае. Так-же отмечу что что при запуске run erase_kimage(под ним скрывается erase ${kernel_addr} ${kernel_size}), происходит стирание объемом не с новое ядро, а с переменную kernel_size. Соответственно если у вас ядро больше чем kernel_size, равный дефолтному разделу под ядро, то произойдет запись в сектора которые не были сброшены. Что в случае NOR памяти приведет к порче данных в тех ячейках. Будь бдителен.

И так, проверяем настройки сети, опять-же в printenv указан IP-адрес tftp-сервера. Кладем ядро в директорию tftp и запускаем run kimage. Во избежание неприятностей не плохо-бы проверить контрольную сумму, запускаем в загрузчике команду crc32 ${memtmp_addr} ${filesize} и сверяем с данным полученными через crc32 vmlinux.gz.uImage на хост-машине, или воспользуемся утилитой iminfo, которая сделает такую-же проверку сама но только если в ядро были вставлены заголовки через mkimage.

Пример последовательности действий при отсутствии алиасов:

tftp 0x80060000 openwrt-ar71xx-generic-uImage-gzip.bin
erase 0xbf050000 +${filesize}
cp.b 0x80060000 0xbf050000 ${filesize}
reset

0x80010000 — адрес места в оперативной памяти, как правило tftp, знает куда нужна писать.
0xbf050000 — адрес(из диапазона предназначения для флеш) откуда начинается загрузка. Можно посмотреть в переменной bootcmd.

Внимание. Все адреса в статье вымышленные и их использование может превратить вашу систему в кирпич!

Так-же через загрузчик можно передать параметры ядру:

setenv bootargs console=ttyS0,115200 rootfstype=jffs2

Некоторые драйвера флешек поддерживает управление разметкой MTD через командную строку:

mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,1024k(kernel),14848k(rootfs),64k(art)ro,15872k@0x70000(firmware)

MTD — механизм посредник между флеш памятью и драйвером файловой системы. Позволяет работать с флешкой как с обычным блочным или символьным устройством. Необходим так-как блоки на флешках(NOR, NAND..) необходимо стирать перед записью.
С загрузчиком закончили, дальше перечислю наиболее популярные причины проблем при загрузке.

Причины провалов


Не загружается загрузчик:
1. Загрузчик был испорчен.
Процессор не может запустить загрузчик. Эту проблему можно решить несколькими методами. Если есть возможность, можно использовать JTAG для восстановления. Либо запрограммировать флешку программатором — обычно флешки подключены по SPI.

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

Не загружается ядро:
1. Неожиданный формат данных.
Загрузчик ждет lzma без подписи mkimage, а получает gzip с подписью. Обычно разработчик выкидывает из загрузчика всё не нужное, поэтому если он сам использует для сжатия ядра gzip, то lzma скорей всего загрузчик не поймет. Так-же бывают более запущенные случае когда загрузчик ожидает перед ядром определенные заголовки. Так-же может не понравиться полностью стрипнутое ядро, так-как загрузчик ожидал увидеть сигнатуру elf-файла.

2. Ядро было некорректно записано.
Например секторы куда оно было записано не были предварительно стерты. Или был записан испорченный образ.

Не монтируется ФС:
1. Не указан рутовая фс.
Ядро не знает какую фс использовать как рутовую. Необходимо указать root=, или в случае openwrt ядро может пропатчено так что-бы автоматом использовать раздел rootfs как рутовый.

2. Ядро не поддерживает данную фс.
Не включена поддержка данной файловой системе в ядре, или включена модулем(initrd обычно не используется). Или не поддерживаются особенности ФС, например сжатие.

3 Собственно нет данных в рутовом разделе.
Возможно был промах с записью ФС из-за неверно указанного смещения или раздела.
Теги:
Хабы:
+3
Комментарии2

Публикации