最近开始做 PowerPC 上的一些东西,在编译内核,启动内核的过程中遇到了很多问题,这两天都块搞屎我了……
不过最终还是解决了,现在把我遇到的问题和解决办法贴在这里,可以供大家参考,也方便我下次遇到同样的问题时可以迅速的找到解决方案。但是需要说的是,导致同样问题的原因可能是多样的,所以我的方法不一定百分百能解决大家的问题。先说下我的环境:
主机:Archlinux (Kernel 3.2.7-1-ARCH)
开发板:AMCC PPC440EP Yosemite
编译工具:ELDK 4.2 (ppc_4xxFP-gcc 4.2.2),make 3.82
根文件系统:NFS (使用 ELDK 提供默认的文件系统)
Uncompressing Kernel Image ... Error: inflate() returned -3 ?UNZIP ERROR - must RESET board to recover
参考:http://www.digipedia.pl/usenet/thread/11725/1540/
Warning: unable to open an initial console
解决办法:后来发现在 ELDK 默认提供的文件系统中没有 /dev 这个目录,当然目录下的所有文件也都没有了。然而 Linux 启动需要读 /dev/console 这个字符文件:
static int noinline init_post(void) { free_initmem(); unlock_kernel(); mark_rodata_ro(); system_state = SYSTEM_RUNNING; numa_default_policy(); if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) printk(KERN_WARNING "Warning: unable to open an initial console.\n");
# mkdir dev # mknod console c 5 1
参考:http://armbbs.net/forum.php?mod=viewthread&tid=10256
VFS: Cannot open root device "nfs" or unknown-block(2,0) Please append a correct "root" boot option Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
# mount -t nfs ip:/path/to/nfs /mnt
如果正常挂载,那么,如果你使用的 Archlinux,使用 NFS 时和别的发行版貌似有点不太一样。设置 bootargs 参数中的 nfsroot 时,需要在 NFS 路径后加上 v3 这个参数,这里附上我的 bootargs 的内容:
=> setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.173:/path/to/nfs,v3 ip=192.168.1.3:1992.168.1.173:192.168.1.1:255.255.255.0:shyodx:eth0:off console=ttyS0,115200
其形式为:
root=/dev/nfs rw nfsroot=serverip:/path/to/nfs,v3 ip=ipaddr:serverip:gatewayip:netmask:hostname:eth0:off console=ttyS0,115200
其中,serverip 是主机 ip 地址。/path/to/nfs 是 NFS 所提供的根目录在你主机上的路径,注意后面加上“,v3”。ipaddr 是开发板的 ip,可以随意指定,但须和 serverip 在同一个网段。gatewayip 是网关地址。netmask 是子网掩码。hostname 是主机名,可随意。
然后再次启动就没有问题了。NND, 搞了两天啊有木有!还一直以为是内核配置的问题,也想到是不是 u-boot 版本太低以至于无法和 3.2 的内核兼容…… 唉……现在的工作就是把内核中一些不需要的配置去掉,编内核去了……