2012-02-20 5 views
2

У меня проблема с переносом ядра из старого SH4 в новый SH4. Пожалуйста, позвольте мне показать разницу между ними.Загрузка ядра Linux прекращается при распаковке Linux ... Хорошо, загрузка ядра

[Старый SH4]
загрузчик: RedBoot v2.0 версия
ядра: 2,4

[Новый SH4]
загрузчик: U-Boot v2009.03
версия ядра: 2,6

В старом SH4 много исходного кода разрабатывается на базе ядра 2.4, поэтому перенос ядра 2.4 на новый SH4 выглядит проще, чем перекомпиляция исходных кодов в ядре 2.6. Поэтому я применил mkimage к zImage, который был разработан для старого SH4, как показано ниже.

mkimage -A sh -O linux -T kernel -C none -a 0x8c210000 -e 0x8c210000 -n 'Old kernel' -d zImage uImage 

Данное изображение загружается на новый SH4, как показано ниже.

tftpboot 8c800000 uImage 
cp.b $(fileaddr) a0100000 $(filesize) 
bootm a0100000 

Однако, после остановки «Uncompressing Linux ... Ok, загрузка ядра» и зависания происходит остановка загрузки. Я обнаружил, что бесконечный цикл происходит в нижних строках ядра/head.S, но я полагаю, что эти строки не имеют проблем, потому что kernel/head.S не настроен и работает на старом SH4.

!    Clear BSS area 
    mov.l 3f, r1 ! __bss_start 
    add  #4, r1 
    mov.l 4f, r2 ! _end 
    mov  #0, r0 
9: cmp/hs r2, r1 
    bf/s 9b  ! while (r1 < r2) 
    mov.l  r0,@-r2 

Таким образом, я предполагаю, что эта проблема возникает из-за разницы в окружающей среде между старым и новым SH4. В старой версии SH4 я выполняю команду fconfig и устанавливаю переменные, как показано ниже.

Load Linux Kernel & File System: true 
Linux Kernel Destination address: 0x8c210000 
Linux Kernel Source address: 0x80140000 
Linux Kernel Size: 0x100000 
RAM disk Destination address: 0x8c360000 
RAM disk Source address: 0x80140000 
RAM disk Size: 0x400000 
Modify Linux Kernel Parameter: true 
Linux Kernel base address: 0x8c001000 
Linux Kernel ENTRY address: 0x8c210000 
Linux Kernel INITRD size: 0xc00000 
Linux Kernel INITRD start address: 0x360000 
Linux Kernel loader type: 1 
Linux Kernel mount root read only: 1 
Linux Kernel original root device: 0x100 
Linux Kernel RAM disk flags: 0 
Linux Kernel Enable Virtual Terminal Console: false 

Я думаю, что я могу установить эти параметры на новом SH4, хотя U-Boot не имеет fconfig команды. Но я не мог найти, как установить параметры Linux Kernel Source address и базовый адрес ядра Linux. Это связано с проблемой повесить? Или любой совет о том, что я должен проверить дальше, будет полезен, поскольку я новичок в встроенной системе Linux.

Благодарим за помощь.

[Отредактировано]
Ниже представлена ​​информация о показах printenv на u-boot.

bootcmd = ICACHE на
bootm A0100000
BootDelay = 2
BAUDRATE = 115200
NETMASK = 255.255.255.0
IPADDR = 192.168.1.2
ServerIP = 192.168.1.1
gatewayip = 0.0.0.0
bootargs = console = ttySC1,115200, N, 8 mem = 32M ether = 8,0x1300,0,0, eth0 video = e1356fb: system: ms104sh4, display: crt, bpp: 8,800x600 @ 60
stdin = serial
stdout = serial
STDERR = серийный

+0

если у вас есть доступ к предварительной загрузки envirnoment, вы можете использовать UBoot 'setenv' команду к установите их. См. Http://www.denx.de/wiki/view/DULG/UBootEnvVariables –

+1

Вы уверены, что это бесконечный цикл?Каковы значения регистров? Код, который вы опубликовали, очищает область RAM. Если адрес загрузки ядра неверен, вы можете удалить ячейку памяти, в которой работает код. У меня была аналогичная проблема, хотя на платформе PowerPC. Моя проблема оказалась неправильными базовыми адресами в конфигурационном файле Linux. –

+0

К J-16 SDiZ: Спасибо за ваш комментарий. Сначала я думал, что могу установить базовый и исходный адрес LINUX через переменную окружения u-boot, но не нашел для них переменных. Возможно, мне приходится устанавливать их по-другому, а не в переменные env. –

ответ

1

Я никогда не работал с SH4, но это помогло мне в прошлом: http://www.denx.de/wiki/view/DULG/LinuxPostMortemAnalysis

+0

Спасибо за ответ. Я проверил адрес log_buf на новом SH4 и обнаружил некоторые ошибки. Он говорит, что «Разбор разделов RedBoot недоступен». Похоже, что у старого ядра SH4 есть зависимость от redboot, и я нашел его на драйверах/mtd/maps. Я не знаю, связана ли эта ошибка с зависанием, но это может быть то место, где мне приходится иметь дело с следующим, а также с настройкой базового адреса Linux. –

+0

И вы действительно должны иметь возможность редактировать базовый адрес Linux, который будет использовать UBoot, попробуйте использовать команду 'printenv' и ищите параметр' bootcmd', он выглядит так на одной из моих систем: 'bootcmd = bootm fc080000 - fc060000', первый аргумент 'bootm' - это адрес изображения, ваш' bootcmd' будет выглядеть иначе. Однако, поскольку вы получаете ошибку RedBoot, базовый адрес, вероятно, не является проблемой. Если вы запустите 'printenv' и опубликуете результаты, это может быть несколько полезно. – mikhail

+0

Спасибо за ответ. Вот результат printenv. bootargs (и некоторые переменные, связанные с ip) изменен, чтобы сделать его таким же, как старый SH4 environment.bootcmd = icache on; bootm a0100000 bootdelay = 2 baudrate = 115200 netmask = 255.255.255.0 ipaddr = 192.168.1.2 serverip = 192.168.1.1 gatewayip = 0.0.0.0 bootargs = console = ttySC1,115200, N, 8 mem = 32M ether = 8,0x1300,0, 0, eth0 video = e1356fb: system: ms104sh4, display: crt, bpp: 8,800x600 @ 60 stdin = serial stdout = serial
stderr = serial –

Смежные вопросы