У меня проблема с переносом ядра из старого 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 = серийный
если у вас есть доступ к предварительной загрузки envirnoment, вы можете использовать UBoot 'setenv' команду к установите их. См. Http://www.denx.de/wiki/view/DULG/UBootEnvVariables –
Вы уверены, что это бесконечный цикл?Каковы значения регистров? Код, который вы опубликовали, очищает область RAM. Если адрес загрузки ядра неверен, вы можете удалить ячейку памяти, в которой работает код. У меня была аналогичная проблема, хотя на платформе PowerPC. Моя проблема оказалась неправильными базовыми адресами в конфигурационном файле Linux. –
К J-16 SDiZ: Спасибо за ваш комментарий. Сначала я думал, что могу установить базовый и исходный адрес LINUX через переменную окружения u-boot, но не нашел для них переменных. Возможно, мне приходится устанавливать их по-другому, а не в переменные env. –