2012-02-20 71 views
2

我有一个将内核从旧SH4移植到新SH4的问题。请让我展示他们之间的差异。Linux内核启动在Uncompressing Linux中停止...好吧,启动内核

[老SH4]
引导加载程序:2.0的RedBoot
内核版本:2.4

[新SH4]
引导加载程序:u-boot的v2009.03
内核版本:2.6

在旧的SH4中,很多源代码是基于内核2.4开发的,因此将内核2.4移植到新的SH4比在内核2.6中重新编译源代码更容易。所以我将mkimage应用于为旧SH4开发的zImage,如下所示。

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 

但是,在“解压Linux ...好,启动内核”并挂起后,启动停止。我发现无限循环发生在kernel/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地址和Linux内核基址的参数。这与挂起问题有关吗?或者关于接下来应该检查什么的建议将会很有帮助,因为我是Linux嵌入式系统的新手。

感谢您的帮助。

[编辑]
下面的信息被添加来显示u-boot上的printenv结果。

bootcmd =上
bootm a0100000
的bootdelay = 2
波特率= 115200
网络掩码255.255.255.0 =
IPADDR = 192.168.1.2
SERVERIP = 192.168.1.1
gatewayip = 0.0.0.0
ICACHE 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
标准错误=串行

+0

如果你有机会到预引导envirnoment,你可以使用的uboot'setenv'命令设置这些。见http://www.denx.de/wiki/view/DULG/UBootEnvVariables – 2012-02-21 01:30:34

+1

你确定它是一个无限循环?什么是寄存器值?您发布的代码是清除RAM区域。如果内核加载地址不正确,则可能会擦除代码正在运行的内存位置。尽管在PowerPC平台上我有类似的问题。我的问题原来是Linux配置文件中的不正确的基地址。 – 2012-02-21 04:52:01

+0

致J-16 SDiZ:感谢您的评论。首先,我认为我可以通过u-boot环境变量设置LINUX基地址和源地址,但没有找到变量。也许我必须以不同于env变量的方式设置它们。 – 2012-02-21 12:23:23

回答

1

我从来没有与SH4工作,但是这有助于我过去:http://www.denx.de/wiki/view/DULG/LinuxPostMortemAnalysis

+0

谢谢你的回答。我在新的SH4上检查了log_buf地址,发现了一些错误。它说像“RedBoot分区解析不可用”。看起来旧的SH4内核依赖于redboot,并且我在drivers/mtd/maps上找到它。我不知道这个错误是否与挂起有关,但这可能是我必须处理下一个以及Linux基址设置的地方。 – 2012-02-21 12:40:10

+0

实际上,你应该可以编辑UBoot将要使用的Linux基地址,试着使用'printenv'命令并查找'bootcmd'参数,它在我的一个系统中看起来像这样:'bootcmd = bootm fc080000 - fc060000','bootm'的第一个参数是映像的地址,你的'bootcmd'看起来不一样。但是,由于您收到RedBoot错误,因此基址可能不是问题:)如果运行'printenv'并发布结果,那可能会有所帮助。 – mikhail 2012-02-21 15:10:41

+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 – 2012-02-23 02:11:24