LINUX.ORG.RU

Установка Astra Linux на Xilinx Zynq 7020

 , ,


1

2

Здравствуйте. Имеется следующая задача. Есть дистр Astra Linux в виде образа для SD карты (как для малины). Состоит из ядра vmlinuz, initrd и rootfs. Железка Xilinx XC7Z020-2CLG484I Zynq-7000 AP SoC На Zynq установлен fsbl и uboot, собран dtb. Имеется самосборный дистр ядро uImage, rootfs и dtb. uImage грузится по 8000 адресу. В документации к uboot написано, что он может загрузить vmlinuz командой bootmz (если не ошибаюсь). Надо заменить свой дистр на астру. Вопрос состоит в том, по каким адресам мне грузить ядро vmlinuz (0х8000 ?), inird и dtb?

Надо понимать, речь идет о Новороссийске, который нифига не community edition? Надо задать вопрос в поддержку. Ведь вы её не просто так купили? ;)

aol ★★★★★
()
Ответ на: комментарий от aol

Пока речь идет о свободной версии Astra Linux Нов для малины. Она есть в репозитории астры в открытом доступе. Но в последующем, есть планы купить специальную версию. Общался, мало что рассказали, весь диалог можно свести к следующему «Вам нужно особая сборка астры, хммммм, ну вот попробуйте данный вариант, возможно он заработает. И так каждый раз.» Вопрос собственно о работе uboot с дистрами в виде vmlinuz, inird, dtb, rootfs. Можно заметить астру на убунту, ничего не изменится. Я знаю как на цинке загрузить uImage и rootfs, а вот если ядро в виде vmlinuz, то раньше я такое не грузил. Пытался ядро обернуть в заголовок uboot, эмоций нуль. Собственно вопрос как в дистрах, которые грузятся с помощью grub, загрузить при помощи uboot? По каким адресам грузить vmlinuz, inird и dtb?

kiruseni
() автор топика

А что здесь непонятного?

Надо заменить свой дистр на астру. Вопрос состоит в том, по каким адресам мне грузить ядро vmlinuz (0х8000 ?), inird и dtb?

Вы говорите у Вас есть рабочая сборка некоего дистриба. Он грузится и работает, как я понимаю?

Ну вот и Астрочку грузите точно так же. Посмотрите как уже сделано и сделайте точно так же.

Moisha_Liberman ★★
()
Ответ на: А что здесь непонятного? от Moisha_Liberman

Есть дистр, который я собрал ручками. Но между ним и астрой есть разница. Отсутствует inird, ядро при сборке было собрано как uImage для uboot. Что за ядро у астры, что они там изменили, я не знаю. Это некий vmlinuz, чёрный ящик. Загрузить vmlinuz как uImage нельзя. Загрузчик такое не умеет. Но я читал, что в теории это возможно.

kiruseni
() автор топика
Ответ на: в Гугле забанили? от anonymous

А вот тут у меня вопрос. В трм к цинку сказано что загрузка происходит с 0 адреса, 8000 и ещё какого то. Если я не ошибаюсь с 0x4200000, как указано тут начинается ОЗУ. Сейчас доступа к трм у меня нет, но 0х8000 вроде не входит в ОЗУ. Собственно вопрос, можно ли грузануть vmlinuz по 0х8000 адресу и при помощи bootmz указать загрузку с данного адреса?

kiruseni
() автор топика
Ответ на: комментарий от kiruseni

Нет официальной версии под арм. Особенно в открытом доступе. То, о чем пишешь - это экспериментальная сборка «тыкайте сами»

в последующем, есть планы купить специальную версию

ванга моде: потом появятся планы купить что-то вместо цинка ;)

aol ★★★★★
()
Ответ на: комментарий от kiruseni

Ну тут просто по идее тогда.

Отсутствует inird, ядро при сборке было собрано как uImage для uboot.

Да, как правило, ядро собирается под zync как make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage. Верно. Будут созданы linux-xlnx/arch/arm/boot/Image и linux-xlnx/arch/arm/boot/zImage. zImage это припакованное ядро, которое грузится в область 640К. Для того, чтобы подготовить такой образ используют mkimage и получают образ linux-xlnx/arch/arm/boot/uImage, который имеет wrapper для zImage внутри себя.

Это некий vmlinuz, чёрный ящик.

vmlinuz это всё то же ядро, только упакованное. По сути, это всё тот же zImage (на это «намекает» команда из приведённой ссылки – cp /usr/src/linux/arch/i386/linux/boot/bzImage /boot/vmlinuz). Но вот тут надо посмотреть поместится ли это ядро в отведённую область памяти, начинающёюся с адреса 0х8000. Или сразу проще грузить его прямо в RAM. По идее, после загрузки оно должно распаковаться и начать исполняться.

По идее, если ядро поместится в 640К, начиная с 0х8000, то грузить можно. Но да, это Astra, так что неизвестно что и как там. Так что Вы в принципе можете написать .scr-файл для описания загрузки или как ещё указать адрес загрузки для своего астровского ядра. Примерно так – bootz ${адрес загрузки Вашего zImage/vmlinuz} - ${адрес, где искать Ваши device tree}. Initrd здесь задействован не будет. Вариантов тут всего два – либо грузить начиная с 0х8000, либо грузить непосредственно в RAM.

Вы могли бы сделать эмулятор процессора Cortex A9 в QEMU и проверить загрузку там? Я, если что-то сомнительно, так и проверяю на всякий случай.

P.S.

Ведь адреса устройств от железки к железки отличаются.

Ну да, а device tree на что? =) Тут надо убедиться что используется именно специфичный для Вашего случая device tree. Или я неправильно понял отцитированное утверждение.

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 2)
Ответ на: Ну тут просто по идее тогда. от Moisha_Liberman

Я имел ввиду, что по ссылке указано грузите ядро по адресу 0хХХХХХХХХ, там был разобран случай для малины. Если я не ошибаюсь, в цинке это начало ОЗУ. А может что-то другое. Никто гарантии не даст, если я буду грузить по специфичным адресам одной железки на другой, что весь зоопарк будет работать. Device tree у меня нужный, я его собирал в вивадо и тестил с uImage.

kiruseni
() автор топика
Ответ на: комментарий от kiruseni

Ясно. Пойдём другим путём...

Я не знаю про какую ссылку Вы говорите про малинку, я не вижу её выше, но да ладно.

«Мы пойдём другим путём».

Дано:

  • У Вас есть 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 ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.