fl2440 uboot 成功引导linux2.6.28.7内核启动

来源:互联网 发布:数据恢复软件合集 编辑:程序博客网 时间:2024/05/17 03:31

之前移植好的uboot怎么也启动不了linux内核,一直报错

Kernel panic - not syncing: Attempted to kill init!

可是使用fl2440官方的fl2440bootloaderV5.1启动内核就很OK!

于是比较两者启动时的内核打印信息,

     发现uboot的启动信息显示:Machine: SMDK2440

     而FL2440BOOTLOADER则显示:Machine:SMDK2410

另外uboot还显示了Oops信息,如下所示:

Unable to handle kernel paging request at virtual address e000030a
pgd = c0004000
[e000030a] *pgd=00000000
Internal error: Oops: 805 [#1]
Modules linked in:
CPU: 0    Not tainted  (2.6.28.7 #343)
PC is at cs8900_probe+0xf8/0x2d0
LR is at 0xe0000300
pc : [<c001bf90>]    lr : [<e0000300>]    psr: a0000013
sp : c03e1df8  ip : e000030f  fp : c03e1e1c
r10: 00000000  r9 : 00000000  r8 : 00000000
r7 : 00000002  r6 : 00000000  r5 : c0d98800  r4 : c0395c7c
r3 : e000030a  r2 : 00000000  r1 : c0da5620  r0 : e000030a
Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: 0000717f  Table: 30004000  DAC: 00000017
Process swapper (pid: 1, stack limit = 0xc03e0268)
Stack: (0xc03e1df8 to 0xc03e2000)
1de0:                                                       c0221fc0 c01537ac
1e00: c0d98800 00000001 00000014 00000000 c03e1e3c c03e1e20 c0224544 c001bea8
1e20: c0d98800 00000000 c001bde4 00000000 c03e1e54 c03e1e40 c02248a4 c0224494
1e40: c0395c78 c0d98800 c03e1e6c c03e1e58 c001be6c c0224870 c0023230 00000000
1e60: c03e1fd4 c03e1e70 c00292e0 c001bdf4 c03e1ee4 c03e1e80 c0072b08 c007269c
1e80: 00000000 c03e1ed4 00000000 00000000 00000000 c03e1ee4 00000000 00000000
1ea0: 00000000 ffffffff c03cf5a0 00000000 00000000 c03fb200 c03cf5a0 00000088
1ec0: 00000000 c03cf5a4 c03e1f2c c03e1ed8 c014f10c c008d484 00000000 c03e1f4c
1ee0: 000000d0 c03dde10 00000000 c0385b90 000000d0 c03847a0 c03e1f24 c03e1f08
1f00: c014f268 c03fc960 c035a600 c03fb200 c03847a0 00000000 00000000 00000000
1f20: c03e1f3c c03e1f30 c014f148 c014ef88 c03e1f6c c03e1f40 c00cac1c c014f140
1f40: c03fb200 c0306c25 c03e1f96 00000088 c03fc960 c035a600 00000050 c03847a0
1f60: c03e1f8c c03e1f70 c00cae88 c00cabf4 c03e1f8c c03fb200 c00caf00 c03e1f96
1f80: c03e1fbc c03e1f90 c006b948 c00cae18 c03e1fac 3038b428 00000000 00000000
1fa0: 00000055 c035a72c 00000000 00000000 c03e1fd4 c03e1fc0 c0023230 00000000
1fc0: 00000000 00000000 c03e1ff4 c03e1fd8 c000859c c0029298 00000000 00000001
1fe0: 00000000 00000000 00000000 c03e1ff8 c004a82c c000852c e92dd830 e24cb004
Backtrace:
[<c001be98>] (cs8900_probe+0x0/0x2d0) from [<c0224544>] (register_netdevice+0xc0/0x3dc)
 r7:00000000 r6:00000014 r5:00000001 r4:c0d98800
[<c0224484>] (register_netdevice+0x0/0x3dc) from [<c02248a4>] (register_netdev+0x44/0x54)
 r7:00000000 r6:c001bde4 r5:00000000 r4:c0d98800
[<c0224860>] (register_netdev+0x0/0x54) from [<c001be6c>] (cs8900_init+0x88/0xb4)
 r5:c0d98800 r4:c0395c78
[<c001bde4>] (cs8900_init+0x0/0xb4) from [<c00292e0>] (__exception_text_end+0x58/0x180)
 r5:00000000 r4:c0023230
[<c0029288>] (__exception_text_end+0x0/0x180) from [<c000859c>] (kernel_init+0x80/0xf0)
 r7:00000000 r6:00000000 r5:00000000 r4:c0023230
[<c000851c>] (kernel_init+0x0/0xf0) from [<c004a82c>] (do_exit+0x0/0x6ac)
 r4:00000000
Code: e28e000a e3500201 e1a03000 328334f6 (e1c360b0)
---[ end trace ae80965c4b6701f0 ]---
Kernel panic - not syncing: Attempted to kill init!

分析Oops信息可以得出是在cs8900_probe函数中出现了问题,引用了野指针,或者指向了不该指的地方。

所以可以肯定的是CS8900网卡驱动的问题,但是FL2440用的是DM9000的网卡啊,结合之前机器代码显示的不同。

所以我把原因归结到了机器代码上面了,FL2440BOOTLOADER给内核传递的机器代码是193,

而我根据uboot移植教程传递给内核的机器代码为:

#if defined(CONFIG_S3C2410)
        /* arch number of SMDK2410-Board */
        gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
#endif
#if defined(CONFIG_S3C2440)
        /* arch number of FL2440-Board */
      gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
#endif

根据这个代码可以知道我们定义了CONFIG_S3C2440,则传递的是MACH_TYPE_S3C2440,再boot命令bdinfo打印板子信号,机器代码为392.

所以我将机器代码改成

       /* arch number of SMDK2410-Board */
        gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;,

则传递了193给内核,重新编译,下载内核烧写,启动成功。

但是还是有个问题,就是用uboot总是无法给内核传递参数。

明天再看看是什么原因。

原创粉丝点击