Bad Linux ARM64 Image magic! #1
Comments
rd-nrg commented May 3, 2019
Hi there! Thank you for the tutorial. I followed the instructions and booted from the SD card but I get the following message:
.
reading system.dtb
33975 bytes read in 18 ms (1.8 MiB/s)
Bad Linux ARM64 Image magic!
ZynqMP>
Can you help me to resolve this issue?
The text was updated successfully, but these errors were encountered:
k0nze commented May 6, 2019 •
Hi, thanks for reporting this bug. Currently I am not able to test it since I have no UltraZed Board available. Doing a quick google search shows that other people have the same issue:
rd-nrg commented May 6, 2019
Looking at the on-screen logs more closely, I noticed the boot process uses the mmcblk1p2 for SD drive and not the mmcblk0p2 so I updated the PetaLinux project configuration using the petalinux-config accordingly.
- Go to Image Packaging Configurations and set ‘Device node of SD device’ option to ‘mmcblk1p2’
Then I found the posts below which are basically stating that the SD is configured read-only for some reason and needs to be writable.
- Added the «disable-wp» to the sdhci1 section in the «petalinux-project-path/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi:
/* SD1 with level shifter /
&sdhci1 <
status = «okay»;
max-frequency = ;
no-1-8-v; / for 1.0 silicon */
disable-wp;
>;
- Rebooted and the problem is gone.
Please refer to the following links for more information:
Источник
Bad Linux ARM64 Image magic
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
| linux-raspi-5.4 (Ubuntu) Edit |
Bug Description
On all pi devices we are testing (rpi3, 3b+, cm3, rpi4, etc. ) when refreshing the kernel snap to the 5.4 kernel in 18-pi (r333), it fails to boot. Here’s the serial log on the failed boot from one of those devices:
Hit any key to stop autoboot: 0
WARNING at /build/ u-boot- GPcj9K/ u-boot- 2019.07+ dfsg/drivers/ mmc/bcm2835_ sdhost. c:408/bcm2835_ send_command( )!
WARNING at /build/ u-boot- GPcj9K/ u-boot- 2019.07+ dfsg/drivers/ mmc/bcm2835_ sdhost. c:408/bcm2835_ send_command( )!
switch to partitions #0, OK
mmc0(part 0) is current device
LOADBOOTENV
Running uenvcmd .
ENVCMD
Saving Environment to FAT. OK
8624908 bytes read in 367 ms (22.4 MiB/s)
3947036 bytes read in 171 ms (22 MiB/s)
67581 bytes read in 22 ms (2.9 MiB/s)
Bad Linux ARM64 Image magic!
Armhf seems to be booting just fine after the refresh.
[Where Problems Could Occur]
The worst that can probably happen is that the device won’t boot, which is the current behavior. Well, since the kernel image is bigger I guess we could run out of disk space on the vfat partition.
I also noticed just now that this kernel from the 20 track does seem to work fine on uc20 systems:
pi-kernel 5.4.0-1042.46 331 20/beta
Changed in linux-raspi-5.4 (Ubuntu Bionic): | |
status: | New → Fix Committed |
Changed in linux-raspi-5.4 (Ubuntu): | |
status: | New → Invalid |
Changed in linux-raspi-5.4 (Ubuntu Bionic): | |
assignee: | nobody → Juerg Haefliger (juergh) |
importance: | Undecided → High |
This appears to be fixed in the current beta kernel for 18-pi — 5.4.0-1042. 46
This bug was fixed in the package linux-raspi-5.4 — 5.4.0-1042. 46
18.04.3) bionic; urgency=medium
* bionic/ linux-raspi- 5.4: 5.4.0-1042. 46
18.04. 3 -proposed tracker
(LP: #1938917)
* Bad Linux ARM64 Image magic (LP: #1938912)
— [Packaging] raspi-bionic: Build uncompressed arm64 kernel images
linux-raspi-5.4 (5.4.0- 1042.46
18.04.1) bionic; urgency=medium
* bionic/ linux-raspi- 5.4: 5.4.0-1042. 46
18.04. 1 -proposed tracker
(LP: #1938037)
Источник
Bad Linux ARM64 Image magic
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
| linux-raspi-5.4 (Ubuntu) Edit |
Bug Description
On all pi devices we are testing (rpi3, 3b+, cm3, rpi4, etc. ) when refreshing the kernel snap to the 5.4 kernel in 18-pi (r333), it fails to boot. Here’s the serial log on the failed boot from one of those devices:
Hit any key to stop autoboot: 0
WARNING at /build/ u-boot- GPcj9K/ u-boot- 2019.07+ dfsg/drivers/ mmc/bcm2835_ sdhost. c:408/bcm2835_ send_command( )!
WARNING at /build/ u-boot- GPcj9K/ u-boot- 2019.07+ dfsg/drivers/ mmc/bcm2835_ sdhost. c:408/bcm2835_ send_command( )!
switch to partitions #0, OK
mmc0(part 0) is current device
LOADBOOTENV
Running uenvcmd .
ENVCMD
Saving Environment to FAT. OK
8624908 bytes read in 367 ms (22.4 MiB/s)
3947036 bytes read in 171 ms (22 MiB/s)
67581 bytes read in 22 ms (2.9 MiB/s)
Bad Linux ARM64 Image magic!
Armhf seems to be booting just fine after the refresh.
[Where Problems Could Occur]
The worst that can probably happen is that the device won’t boot, which is the current behavior. Well, since the kernel image is bigger I guess we could run out of disk space on the vfat partition.
I also noticed just now that this kernel from the 20 track does seem to work fine on uc20 systems:
pi-kernel 5.4.0-1042.46 331 20/beta
Changed in linux-raspi-5.4 (Ubuntu Bionic): | |
status: | New → Fix Committed |
Changed in linux-raspi-5.4 (Ubuntu): | |
status: | New → Invalid |
Changed in linux-raspi-5.4 (Ubuntu Bionic): | |
assignee: | nobody → Juerg Haefliger (juergh) |
importance: | Undecided → High |
This appears to be fixed in the current beta kernel for 18-pi — 5.4.0-1042. 46
This bug was fixed in the package linux-raspi-5.4 — 5.4.0-1042. 46
18.04.3) bionic; urgency=medium
* bionic/ linux-raspi- 5.4: 5.4.0-1042. 46
18.04. 3 -proposed tracker
(LP: #1938917)
* Bad Linux ARM64 Image magic (LP: #1938912)
— [Packaging] raspi-bionic: Build uncompressed arm64 kernel images
linux-raspi-5.4 (5.4.0- 1042.46
18.04.1) bionic; urgency=medium
* bionic/ linux-raspi- 5.4: 5.4.0-1042. 46
18.04. 1 -proposed tracker
(LP: #1938037)
Источник
Как работает команда bootm в u-boot?
Добрый день! Задача загрузится с флэшки ,на которой лежит kernel.img(образ ядра) и rk3399_rkb.dtb(device tree). файловая система fat32. Использую команду fatload, все считывается в память, расстояние между образами выбираю приличное. После чего запускаю команду bootm.
Соответственно отсюда вопрос, что я делаю не так. То ли не туда считываю ядро и device tree ,то ли формат ядра совсем другой(даже не представляю какой еще может быть, тут обычный «IMG») , то ли bootm нужно что-то еще в качестве третьего аргумента, например ramdisk. Подскажите кто сталкивался с подобной проблемой?
Ты сам собирал ядро в образ? После сборки ядра из исходников ты не забыл обернуть ядро «юбутовской» программкой «mkimage»? В ней «Ю-бут» добавляет к ядру адреса куда переносить ядро в ОЗУ. Файловая система пока нипричем. Я бы посмотрел как создавался образ ядра или сделал его заново из собранного ядра.
Она же аглицким языком пишет: Wrong Image Format for bootm command
booti 0x02800000 — 0x0A800000
Образ ядра создавался предположительно с помощью команд
в итоге должен был получиться файл kernel.img и еще файл resource.img в котором лежит device tree. Я не оборачивал образ mkimag-ем ,т.к. получил следующее сообщение и думаю, я что-то делаю не так опять же.
И как действовать дальше я не знаю
И как действовать дальше я не знаю.
- Насколько я понимаю, образ ядра собирал не ты? Почему тогда не возьмёшь проверенный рабочий образ?
- Если работоспособного работающего образа ядра найти не удаётся, то придётся собирать ядро из исходных текстов самостоятельно.
- У тебя размер ядра составляет около 20 МБ. Не многовато? Возможно, что после копирования настроек сборки ядра необходимо выполнить команду:
- Сборку осуществляешь на целевой плате? Если плата рабочая, то и работающее ядро должно уже быть. Зачем ты пытаешься собрать новое ядро-то? Чем работающее ядро не устраивает?
У меня есть рабочее ядро и устройство запускается на нем. Я понял почему я получаю ошибку Bad magic number — мое ядро (kernel.img) не заархивировано, т.е. это не zImage. Поэтому у меня возник сейчас вопрос — можно ли как то из обычного ядра получить самораспаковывающийся zImage?
Поэтому у меня возник сейчас вопрос — можно ли как то из обычного ядра получить самораспаковывающийся zImage?
Я вижу два возможных пути решения задачи:
а) собранное ядро не сжимать, а просто пересоздать образ ядра командой «mkimage», указав ей, что ядро не сжато;
б) собранное ядро сжать командой «gzip -k CompiledKernelFileName» и пересоздать образ ядра из этого сжатого ядра через «mkimage».
Замысел в том, чтобы дать знать загрузчику «Ю-буту» сжато ли ядро или нет через входные параметры команды «mkimage».
У тебя сборка происходит таким образом, что образ ядра создаётся автоматически и не нужно вручную запускать команду «mkimage»? Тогда может потребоваться прописать команду сжатия ядра «Гзипом» сразу после сборки и перед созданием образа ядра.
Я имею уже готовый Image ядра, новый скомпилировать не могу ввиду ошибок сборки. Mkimage приходится запускать вручную. У меня вопрос по пункту Б. Если я просто выполню команду описанную в Б ,я получу именно zImage или просто сжатый образ. Просто как я понял zImage это некий особый формат с хедером и самораспаковывающимся кодом. Есть ли между ними разница? Вариант А пробовал реализовать. создал uImage из Image, указав что ядро не сжато. Потом закинул образ на флэшку с файловой системой fat32. Далее вошел в командную строку юбута и загрузил в память образ с помощью команды fatload, по адресу указанному в параметрах mkimage. Далее вызываю bootm 0x…. (адрес загрузки) и получаю сообщение
Что говорит о том ,что что-то я делаю не так
Так, сейчас еще раз попробовал проделать данную последовательность действий и bootm сжалился надо мной… но не надолго. Теперь вылетает новая ошибка
причем с несжатым ядром точно такая же ошибка. Как можно это пофиксить? может bootm нужен еще device tree или ramdisk?
Все, с этой проблемой тоже разобрался(надо было поменять архитектуру с arm на arm64:) но теперь у меня новое несчастье.
И вот тут у меня опять только 1 идея. Проблема с ramdisk или с device tree. Если кто-то сталкивался с этой проблемой ,хелп!)
«Synchronous Abort» handler, esr 0x02000000
Передача управления от загрузчика ядру произошла успешно. До подгрузки файловой системы дело еще не дошло, ошибка вряд ли вызвана этим.
Первым делом я бы проверил адрес в ОЗУ куда загрузчик кладет распакованное ядро, не затираются ли данные наложением друг на друга. Затем можно включить вывод ранних отладочных сообщений ядра в консоль при загрузке. Это включается в настройках сборки ядра в разделе «kernel hacking» или вроде того. Ищи настройку «early printk». Ядро нужно будет пересобрать в этом случае. Дальше уже видно будет что не так.
Как можно проверить куда загрузчик кладет ядро? (и кстати ядро не сжато ,так что и распаковки не должно быть вроде бы). Насчет early printk: у меня в bootargs имеется строчка earlycon=uart8250 и когда я гружусь с eMMC где у меня лежит это же самое ядро у меня выводится подробная отладочная информация наподобие такой:
и т.д. так что вроде бы и включать ничего не надо. Может ли быть такое что ядро не грузится из-за того что я его загружаю в область памяти не являющейся ОЗУ, потому что я сейчас изучаю карту памяти rk3399 и там по адресам по которым я загружаю uImage находится bootrom или flash
либо я совсем запутался и мне нужно еще читать и читать документацию
Как можно проверить куда загрузчик кладет ядро?
В загрузчике «Ю-буте» сделано таким образом, что запуская на исполнение ядро «Линукса» командой «bootm KernelAddressInSdram», само ядро перед запуском на исполнение будет скопировано с этого адреса по новому адресу, который ты указал при создании образа ядра во входных параметрах команды «mkimage».
Почему «Ю-бут» сразу не распаковывает сжатое ядро и файловую систему по адресам исполнения, а сначала распаковывает в одну область ОЗУ, а затем копирует перед исполнением в другую? Я пока не догадался, может быть, народ тут подскажет.
В остальном ты мыслишь в правильном направлении: вывод отладочных сообщений можно включать через входные параметры ядра при загрузке. Ты это верно подметил. Дальше если будут ошибки, то по тексту сообщения об ошибке можно найти строку исходного кода ядра где эта ошибка выявляется. Иногда я просто убираю лишние проверки в исходнике ядра таким образом, пересобираюсь и ошибки уже как не бывало.
Я посмотрел исходники.
данная строчка есть только в исходниках u-boot-a. То есть по идее после передачи управления ядру ,юбут вызывает какое-то исключение а не ядро
«Synchronous Abort» handler, esr 0x02000000
Выложи сюда полный лог отладочных сообщений, начиная мгновением включения питания твоей платы до аварийной перезагрузки процессора. Посмотрим вместе.
вот полный вывод консоли при загрузке с usb с ядром упакованным в обертку от mkimage. А вот вывод консоли при успешной загрузке ,когда ядро лежит на eMMC с помощью команды bootrk, вшитой в модифицированный юбут. Адреса загрузки и там и там одинаковые, поэтому хз в чем может быть проблема.
Starting kernel … «Synchronous Abort» handler, esr 0x02000000
Действительно, загрузка валится в «Ю-буте», до ядра ещё не доходит дело.
Насколько я понимаю, ты используешь видоизменённый рокчиповцами «Ю-бут» с «Гитхаба»?
Раз ядро у тебя грузится с флэш-карты, то оно уже обернуто «mkimage’м» для загрузки после сборки из исходных текстов. А раз так, то я бы попробовал вынуть информацию об адресах загрузки из самого файла образа ядра. Зачем гадать куда грузить ядро, если в образе эта информация уже имеется? Как именно вынуть информацию прямо сейчас я не готов сказать, нужно читать.
В «Ю-буте» перед загрузкой ядра выведи значения переменных:
Посмотрим какой размер памяти у тебя выделен для загрузки ядра из ОЗУ и какие параметры подсовываются ядру «Ю-бутом».
Посмотрим какой размер памяти у тебя выделен для загрузки ядра из ОЗУ и какие параметры подсовываются ядру «Ю-бутом».
А лучше все переменные окружения «Ю-бута» выведи. Посмотрим как загрузка настроена.
вот полный вывод консоли при загрузке с usb с ядром упакованным в обертку от mkimage. А вот вывод консоли при успешной загрузке ,когда ядро лежит на eMMC с помощью команды bootrk, вшитой в модифицированный юбут. Адреса загрузки и там и там одинаковые, поэтому хз в чем может быть проблема.
Крокодил, ты чего притих-то? Я представляю, что перезагрузка процессора происходит из-за того, что память под «bootm» не выделена. Рокчиповцы грузятся через «bootrk», а мы через «bootm» с невыделенной для этого памятью. «Ю-бут» пытается очистить невыделенную память «bootm’a» и валится.
С тремя переменными «Ю-бута» осталось разобраться: bootm_low, bootm_mapsize, bootm_size. Продолжай начатое дело, осталось немного и победим.
Источник