LINUX.ORG.RU

Проблемы при загрузке ядра 2.6 u-boot-ом


0

2

(Прошу прощения, если запостил не в тот раздел, но проблема не узконаправленная)

Есть evaluation board на однокристаллке micrel KSZ9692PB. В его nand уже прошит u-boot и рам-диск с ядром и файловой системой.

Сам по себе u-boot работает и по дефолту загружает уже прошитый туда линукс. С этим всё ок.

Однако, я решил сам взять предлагаемый micrel-ом линукс (можно скачать и линукс и весь инструментарий на сайте производителя) и научиться его компилить (никогда не делал этого) и загружать в память по tftp u-boot-ом и запускать.

Казалось бы всё просто: майкрел предоставляет ядро уже с патчами, мейкфайл с готовым конфигом под его eval-board.

Я компилю ядро, оно компилится успешно (в конце пишет Load Address 0x8000 — вот тут может беда), я беру получившийся zImage и с помощью mkimage делаю uImage, но уже указываю адреса 0x800000 в место 0x8000 (производитель рекомендует загружать с 0х800000, не знаю почему)

Аргументы mkimage выглядят у меня так: — A arm — O linux -T kernel -C none -a 0x800000 -e 0x800000 -n 'linux-2.6-atatat-edition' -d zImage uImage

Файловая система у меня отдельно на USB флэшечке, но до неё дело не доходит )) всё умирает гораздо раньше =\.

После этого получившийся образ засасываю через tftp u-bootom, коммандой tftp 0x800000 uImage, устанавливаю параметры консоли (setenv bootargs 'console=ttyAM0,115200 root=/dev/sda1') ...

и радостно пытаюсь сделать bootm 0x800000

На что u-boot мне сообщает:

## Booting image at 00800000 ... Image Name: linux-2.6-atatat-edition Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 4610920 Bytes = 4.4 MB Load Address: 00800000 Entry Point: 00800000 Verifying Checksum ... OK XIP Kernel Image ... OK

Starting kernel ...

data abort pc : [<0080000c>] lr : [<00f1abf0>]sp : 00ecfaf4 ip : 00f5cc00 fp : 00000002 r10 : 00000000 r9 : 00f5cc00 r8 : 00ecffdc r7 : 00000000 r6 : 00000000 r5 : 00000000 r4 : 00000000 r3 : 00800000 r2 : 00000100 r1 : 0000016b r0 : 00000160 Flags: nZCv IRQs off FIQs off Mode SVC_32 Resetting CPU...

и всё, ребут.

соответственно я в полном замешательстве т.к. знания линукса и АРМа у меня посредственные — ещё только начал изучать.

В чём может быть проблема?

(алсо почему-то форум мою няшную копипасту дампа превратил в какую-то кашу. ничего не могу поделать)


> (алсо почему-то форум мою няшную копипасту дампа превратил в какую-то кашу. ничего не могу поделать)

Нужно было либо пользоваться LORCODE и оборачивать все «цитаты» в [code]...[/code], либо User line breaks.
Переключать глобально на http://www.linux.org.ru/edit-profile.jsp либо под полем для ввода сообщения.

AITap ★★★★★ ()

Чего ты уверен что у тебя проблема из-за какого-то адреса?
Попробуй образ ядра собрать командой «make uImage»(естественно с установленными переменными ARCH, CROSS_COMPILE). make сам вызовет mkimage с нужными параметрами.

gnu-eabi ()

Грузи с того адреса какой написан. И тулчейном собирай тем, которым оригинальное ядро собрано

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от gnu-eabi

Да, делал make uImage (про переменные ничего не могу сказать, по моему они уже заданы в мейкфайле)

Получившийся uImage я загружал убутом по 0x8000 в память и пытался сделать bootm 0x8000, но результат, если я ничего не путаю - тот же самый (data abort)

Пробовал делать имедж с адресом загрузки 0х800000 и загружать его по этому адресу - не пашет.

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

Я хотел сказать, что если мне мой маразм не изменяет, XIP поверх NAND'а не работает. И еще мне как бы казалось, что часто бывает, что то что ниже 0x80000000 вполне может оказаться этим самым NAND'ом.

vasily_pupkin ★★★★★ ()

>Я компилю ядро, оно компилится успешно (в конце пишет Load Address 0x8000 — вот тут может беда), я беру получившийся zImage и с помощью mkimage делаю uImage, но уже указываю адреса 0x800000 в место 0x8000 (производитель рекомендует загружать с 0х800000, не знаю почему)

Попробуй имидж загружать по адресу 0x800000 а запускать по адресу 0x8000, загрузчик читает заголовок и перемещает образ - откидывает 64 байта заголовка и копирует сам имидж, смещение от начала памяти 8000 делается для того чтобы параметры передаваемые ядру не затереть - их загрузчики кладут в самое начало.

A arm — O linux -T kernel -C none -a 0x8000 -e 0x8000 -n 'linux-2.6-atatat-edition' -d zImage uImage

tftp 0x800000 uImage
bootm 0x800000

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

>я беру получившийся zImage

zimage - это самораспаковывающийся архив, когда ты делаешь одинаковые адреса загрузки а запуска - скорей всего имидж просто сам себя затирает при распаковке.

anonymous ()
Ответ на: комментарий от vasily_pupkin

to vasili_pupkin ты неправильно меня понял. я гружу НЕ в нанд а в оперативку и учитывая что оперативки 64мб - 0х800000 - это ещё оперативка.

алсо грузить в 0х800000 и запускать по 0х8000 - нельзя. команда tftp 0x800000 uImage - кладёт уимадж по этому адресу памяти, команда bootm просто этот имадж запускает (никуда его не двигая).

если же всё-таки попытаться это сделать, то он bootm напишет просто ## Booting image at 00008000 ... Bad Magic Number

второе:

если брать uImage, получившийся после дефолтного тулчейна, то его Entry Point будет 0х8000.

если такой образ загрузить в 0х800000, то убут ведёт себя странно: он пишет «ункомпрессинг имадж», рисует точечки прогресса декомпрессии... рисует, рисует, рисует и виснет не сказав ничего.

есди взять zImage, получившийся после дефолтного тулчейна и с помощью mkimage сделать из него uImage самому, указав адреса 0х8000, но убрав компрессию (дефолтный уИмадж со сжатием) и если загружать этот уИмадж в 0x8000, и запустить его, то пишет data abort

третее:

сейчас заметил, что получающийся после компиляции ядра файл Image (просто Image) весит 3 ГБ !!! По моему в этом и беда.

Ох, понаписал, всех запутал наверное =\, чуть позже попробую расписать по шагам все свои действия, что бы было более очевидно, что у меня происходит.

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

алсо грузить в 0х800000 и запускать по 0х8000 - нельзя. команда tftp 0x800000 uImage - кладёт уимадж по этому адресу памяти, команда bootm просто этот имадж запускает (никуда его не двигая).

Да ты упоротый :-) http://www.denx.de/wiki/DULG/UBootCmdGroupExec

The bootm command is used to start operating system images. From the image header it gets information about the type of the operating system, the file compression method used (if any), the load and entry point addresses, etc. The command will then load the image to the required memory address, uncompressing it on the fly if necessary. Depending on the OS it will pass the required boot arguments and start the OS at it's entry point. ...
When booting images that have been loaded to RAM (for instance using TFTP download) you have to be careful that the locations where the (compressed) images were stored do not overlap with the memory needed to load the uncompressed kernel. For instance, if you load a ramdisk image at a location in low memory, it may be overwritten when the Linux kernel gets loaded. This will cause undefined system crashes.

а вот то что ты описал делается командой go

The go command is used to start such standalone applications.

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

действительно я ступил.

но почему-же тогда при загрузке имаджа в 0х800000 и попытке выполнить bootm 0x8000 - он пишет Bad Magic Number?

И какого чёрта у меня запакованный образ ядра весит 3 гига )))?

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

Вобщем вот мои действия по шагам:

первый вариант:

беру предлагаемое разработчиком ядро делаю make clean make ksz9692_defconfig (конфиг под мою плату) make uImage

получается: Image Name: Linux-2.6.23.17-Pegasus Created: бла бла бла Image Type: ARM Linux Kernel Image (uncompressed) Data Size: бла бла 4.40MB Load Address: 0x00008000 Entry Point: 0x00008000

загружаю этот образ на арм-машину: setenv bootargs 'console=ttyAM0,115200 root=/dev/sda1' tftp 0x800000 uImage

запускаю: bootm 0x800000

вижу: ## Booting image at 00800000 ... Image Name: Linux-2.6.23.17-Pegasus Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 4610916 Bytes = 4.4 MB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK OK

Starting kernel ...

Uncompressing Linux.......... И ТУТ МЁРТВЫЙ ВИСЯК.

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

>Uncompressing Linux.......... И ТУТ МЁРТВЫЙ ВИСЯК.

Это судя по всему непосредственно с загрузчиком никак не связано - для начала попробуй включить в ядре early printk если конечно это китайское говно его поддерживает :) Еще можешь в u-boot посмотреть - возможно там уже есть правильные параметры загрузки - printenv.

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

вот дефолтные параметры убута на этой железяке

boot > printenv
bootcmd=bootm 0x1c040000
bootdelay=3
baudrate=115200
ethaddr=00:10:A1:96:92:01
eth1addr=00:10:A1:96:92:11
autoload=n
get=tftp 0x800000 uImage
filesize=4544e8
netmask=255.255.255.0
ipaddr=192.168.1.200
serverip=192.168.1.11
runimag=bootm 0x800000
makeimg=run get; run runimag
mkcfargs=setenv bootargs console=ttyAM0,115200 root=/dev/sda1 rootdelay=10
bootargs=console=ttyAM0,115200 root=/dev/sda1 rootdelay=10
runcf=run mkcfargs;run makeimg
stdin=serial
stdout=serial
stderr=serial
fileaddr=800000

щас попробую включить early printk

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

WIN!

я сменил компелятор с arm-linux-gcc-gnueabi-4.5 на arm-linux-gcc-4.2.1


И ВСЁ ЗАРАБОТАЛО

и, что характерно файл Image весит больше не 3 гига а 3 с лишним метра, ну и uImage соответствено не 4.4 а 1.5мб


магия какая-то. пипец.

izyan ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.