История изменений
Исправление
Moisha_Liberman,
(текущая версия)
:
Я не знаю про какую ссылку Вы говорите про малинку, я не вижу её выше, но да ладно.
«Мы пойдём другим путём».
Дано:
-
У Вас есть device tree, адреса для него Вы знаете. Вы его отработали в vivado, хорошо.
-
У Вас есть некий vmlinuz, который собран под ARMv7. Его надо загрузить и с ним вопросы.
Задача:
Загрузить неизвестный vmlinuz на процессор ARM, входящий в состав Zynq 7020. Вроде, он подготовлен под ARMv7 (но тоже хорошо бы проверить так ли это).
Решение:
1 Исследовать приведённый vmlinuz на предмет необходимого адресного пространства для загрузки. Вам надо понять как оно вообще грузится-то. Для этого – берём QEMU для ARMv7 и грузим приведённый образ, наблюдая за тем, сколько памяти надо. Вам нужен qemu-system-arm для теста, делаем с его помощью виртуалочку тестовую, грузим, смотрим. Если вообще не загрузится и будет ясно что этот образ не под ARMv7 подготовлен, то сразу его на фиг и выходим из задачи. Если он грузится и опознаётся как образ под ARMv7, исследуем процесс его загрузки и переходим к п.2.
2 Образ vmlinuz это бОльший по размеру образ zImage (ссылку на материал, это доказывающий, я привёл выше). Следовательно, загрузка будет либо в 0х8000, либо в начало RAM. Скорее всего в 0х8000, т.к. там всего-навсего надо стартовую часть загрузить, а она всяко-разно меньше 640К. Дальше уже ядро само разберётся чего и куда там распаковывать – у Вас есть dtb, я напоминаю.
2.1 Если в п.1 мы увидели, что загруженный стартовый кусок vmlinuz требует менее 640К, то мы можем грузить образ в 0х8000. Это наиболее вероятный сценарий.
2.2 Если требуется более 640К, то смотрим спеку на Zynq 7020, определяемся с началом RAM и грузим туда. Вам нужно будет загрузиться в адресное пространство ядра процессора 0х0, т.е., в первое ядро. Тут Вам не повезло, но бывает иногда.
Примечания к решению:
Команда загрузки приведена в комментарии выше. Заодно Вам надо сделать man u-boot-tools или как там в Вашем дистрибе это называется. В приведённой выше команде не нужен initrd, там только образ и dtb используются. Заодно сделайте man u-boot в общем и целом (прочтите доки на u-boot и на u-boot-tools, я это имею в виду).
Показываю примерный результат (только что):
Tran Speed:reading uImage
3842280 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
8955 bytes read in 20 ms (436.5 KiB/s)
## Booting kernel from Legacy Image at 0008000
Entry Point: 00008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
Booting using the fdt blob at OK
Loading Device Tree to 1eb0e000, end 1eb132fa ... OK
Starting kernel .... done, booting the kernel.
Напоминаю что uImage это всё тот же zImage/vmlinuz, но с готовым раппером. Т.е., по сути, я загрузил начальную часть своего ядра в адреса 0х8000 просто потому, что оно грамотно подготовлено и не требует более 640К размера адресного пространства для загрузки начальной части. Хотя, само ядро и весит 3842280 bytes в итоге, т.е., явно более 640К. Минимальная часть загрузилась и стартанула, получила управление, начала распаковку, распаковалась, передала управление на начало исполняемого кода. Последняя строка в выхлопе об этом и говорит.
Что там наготовила Astra – смотрите сами. Как это сделать – сказано выше.
Нет, я не буду разбираться с Astra для ARM, это не входит в мои задачи. Извините.
Удачи.
Исправление
Moisha_Liberman,
:
Я не знаю про какую ссылку Вы говорите про малинку, я не вижу её выше, но да ладно.
«Мы пойдём другим путём».
Дано:
-
У Вас есть device tree, адреса для него Вы знаете. Вы его отработали в vivado, хорошо.
-
У Вас есть некий vmlinuz, который собран под ARMv7. Его надо загрузить и с ним вопросы.
Задача:
Загрузить vmlinuz на процессор ARM, входящий в состав Zynq 7020.
Решение:
1 Исследовать приведённый vmlinuz на предмет необходимого адресного пространства для загрузки. Вам надо понять как оно вообще грузится-то. Для этого – берём QEMU для ARMv7 и грузим приведённый образ, наблюдая за тем, сколько памяти надо. Вам нужен qemu-system-arm для теста, делаем с его помощью виртуалочку тестовую, грузим, смотрим.
2 Образ vmlinuz это бОльший по размеру образ zImage (ссылку на материал, это доказывающий, я привёл выше). Следовательно, загрузка будет либо в 0х8000, либо в начало RAM. Скорее всего в 0х8000, т.к. там всего-навсего надо стартовую часть загрузить, а она всяко-разно меньше 640К. Дальше уже ядро само разберётся чего и куда там распаковывать – у Вас есть dtb, я напоминаю.
2.1 Если в п.1 мы увидели, что загруженный стартовый кусок vmlinuz требует менее 640К, то мы можем грузить образ в 0х8000. Это наиболее вероятный сценарий.
2.2 Если требуется более 640К, то смотрим спеку на Zynq 7020, определяемся с началом RAM и грузим туда. Вам нужно будет загрузиться в адресное пространство ядра процессора 0х0, т.е., в первое ядро. Тут Вам не повезло, но бывает иногда.
Примечания к решению:
Команда загрузки приведена в комментарии выше. Заодно Вам надо сделать man u-boot-tools или как там в Вашем дистрибе это называется. В приведённой выше команде не нужен initrd, там только образ и dtb используются. Заодно сделайте man u-boot в общем и целом (прочтите доки на u-boot и на u-boot-tools, я это имею в виду).
Показываю примерный результат (только что):
Tran Speed:reading uImage
3842280 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
8955 bytes read in 20 ms (436.5 KiB/s)
## Booting kernel from Legacy Image at 0008000
Entry Point: 00008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
Booting using the fdt blob at OK
Loading Device Tree to 1eb0e000, end 1eb132fa ... OK
Starting kernel .... done, booting the kernel.
Напоминаю что uImage это всё тот же zImage/vmlinuz, но с готовым раппером. Т.е., по сути, я загрузил начальную часть своего ядра в адреса 0х8000 просто потому, что оно грамотно подготовлено и не требует более 640К размера адресного пространства для загрузки начальной части. Хотя, само ядро и весит 3842280 bytes в итоге, т.е., явно более 640К. Минимальная часть загрузилась и стартанула, получила управление, начала распаковку, распаковалась, передала управление на начало исполняемого кода. Последняя строка в выхлопе об этом и говорит.
Что там наготовила Astra – смотрите сами. Как это сделать – сказано выше.
Нет, я не буду разбираться с Astra для ARM, это не входит в мои задачи. Извините.
Удачи.
Исходная версия
Moisha_Liberman,
:
Ясно. Пойдём другим путём...
Я не знаю про какую ссылку Вы говорите про малинку, я не вижу её выше, но да ладно.
«Мы пойдём другим путём».
Дано:
-
У Вас есть device tree, адреса для него Вы знаете. Вы его отработали в vivado, хорошо.
-
У Вас есть некий vmlinuz, который собран под ARMv7. Его надо загрузить и с ним вопросы.
Задача:
Загрузить vmlinuz на процессор ARM, входящий в состав Zynq 7020.
Решение:
1 Исследовать приведённый vmlinuz на предмет необходимого адресного пространства для загрузки. Вам надо понять как оно вообще грузится-то. Для этого – берём QEMU для ARMv7 и грузим приведённый образ, наблюдая за тем, сколько памяти надо. Вам нужен qemu-system-arm для теста, делаем с его помощью виртуалочку тестовую, грузим, смотрим.
2 Образ vmlinuz это бОльший по размеру образ zImage (ссылку на материал, это доказывающий, я привёл выше). Следовательно, загрузка будет либо в 0х8000, либо в начало RAM. Скорее всего в 0х8000, т.к. там всего-навсего надо стартовую часть загрузить, а она всяко-разно меньше 640К. Дальше уже ядро само разберётся чего и куда там распаковывать – у Вас есть dtb, я напоминаю.
2.1 Если в п.1 мы увидели, что загруженный стартовый кусок vmlinuz требует менее 640К, то мы можем грузить образ в 0х8000. Это наиболее вероятный сценарий.
2.2 Если требуется более 640К, то смотрим спеку на Zynq 7020, определяемся с началом RAM и грузим туда. Вам нужно будет загрузиться в адресное пространство ядра процессора 0х0, т.е., в первое ядро. Тут Вам не повезло, но бывает иногда.
Примечания к решению:
Команда загрузки приведена в комментарии выше. Заодно Вам надо сделать man u-boot-tools или как там в Вашем дистрибе это называется. В приведённой выше команде не нужен initrd, там только образ и dtb используются. Заодно сделайте man u-boot в общем и целом (прочтите доки на u-boot и на u-boot-tools, я это имею в виду).
Показываю примерный результат (только что):
Tran Speed:reading uImage
3842280 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
8955 bytes read in 20 ms (436.5 KiB/s)
## Booting kernel from Legacy Image at 0008000
Entry Point: 00008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
Booting using the fdt blob at OK
Loading Device Tree to 1eb0e000, end 1eb132fa ... OK
Starting kernel .... done, booting the kernel.
Напоминаю что uImage это всё тот же zImage/vmlinuz, но с готовым раппером. Т.е., по сути, я загрузил начальную часть своего ядра в адреса 0х8000 просто потому, что оно грамотно подготовлено и не требует более 640К размера адресного пространства для загрузки начальной части. Хотя, само ядро и весит 3842280 bytes в итоге, т.е., явно более 640К. Минимальная часть загрузилась и стартанула, получила управление, начала распаковку, распаковалась, передала управление на начало исполняемого кода. Последняя строка в выхлопе об этом и говорит.
Что там наготовила Astra – смотрите сами. Как это сделать – сказано выше.
Нет, я не буду разбираться с Astra для ARM, это не входит в мои задачи. Извините.