最近开始做 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 提供默认的文件系统)
问题1
Uncompressing Kernel Image ... Error: inflate() returned -3
?UNZIP ERROR - must RESET board to recover
解决办法:修改 loadaddr 的值。适当的加大 loadaddr 的值。在我的开发板上,我把原来的 0x400000 改成了 0x600000。
参考:http://www.digipedia.pl/usenet/thread/11725/1540/
问题2
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");
没有这个文件当然也就无法完成启动,所以手动为这个根文件系统建立 /dev 目录和 /dev/console 文件:
# mkdir dev
# mknod console c 5 1
参考:http://armbbs.net/forum.php?mod=viewthread&tid=10256
问题3
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)
解决办法:这是说明你的 bootargs 中的参数有问题,请仔细检查参数中有没有什么地方写错了,比如说 ip 地址,或者 NFS 的目录,也请检查你的 NFS 是否能被访问,可以使用同一个网段的另外一台机器试着挂载你的 NFS,看是否成功:
# mount -t nfs ip:/path/to/nfs /mnt
如果挂载失败,那么请检查你的 NFS 服务和相关的服务是否开启。还请检查你的 /etc/exports 文件是否配置好 NFS 的路径和访问权限,以及 /etc/hosts.deny 和 /etc/hosts.allow 文件,看是否禁止了别的 ip 访问你的机器。
如果正常挂载,那么,如果你使用的 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 的内核兼容…… 唉……现在的工作就是把内核中一些不需要的配置去掉,编内核去了……