在嵌入式 Linux 开发过程经常会遇到内核卡死的情况,输出如下信息,本文就来分析内核卡死的原因及当遇到这种情况应该从哪几个方面来解决。Starting kernel ...

Uncompressing Linux....................................................................................................................................................... done, booting the kernel.

1. machine id(机器 ID)不匹配 (针对低版本内核)

如果 u-boot 传入的机器 ID 和 kernel 里面所用的 ID 不同会导致内核卡死。但是在比较新的内核里,如果由于机器 ID 不匹配,内核会输出提示信息的。

Error: unrecognized/unsupported machine ID (r1 = 0x000007cf).

Available machine support:

ID (hex)        NAME

000000c1        SMDK2410

0000015b        IPAQ-H1940

0000039f        Acer-N35

2. 内核启动参数设置有误

内核启动时检查是否有从 u-boot 那里传递过来的启动参数,如果有就使用,如果没有就用内核默认的设置,在这里有两种情形可能出现问题。

情形1:

如果 u-boot 没有传递启动参数给内核,那么内核就会用默认的启动参数;

make menuconfig

Boot options  --->

()  Default kernel command string

如果内核没有设置默认启动参数或者启动参数设置不对,那么内核启动过程就会卡死。

情形2:

如果 u-boot 有传递启动参数给内核,那么问题就出现在 u-boot 传入的参数上,首先 u-boot 要传参数给内核,就必须在配置文件里面定义 CONFIG_XXX_TAG 这类宏,u-boot 是通过 tag 将信息传递给内核,一般要传入 起始 tag、内存 tag、命令行 tag 和 结束 tag。下面代码摘自 u-boot 源码:

char *commandline = getenv ("bootargs");
setup_start_tag (bd);
setup_memory_tags (bd);
setup_commandline_tag (bd, commandline);
setup_end_tag (bd);
大致的流程是 u-boot 从 bootargs 环境变量里面获得命令行参数,然后设置各个 tag,因此如果 u-boot 要给内核传递命令行参数,那么就要设置 bootargs 这个环境变量。下面是两个设置的例子:
nfs文件系统命令行参数:
set bootargs console=ttySAC0,115200
root=/dev/nfs nfsroot=192.168.1.101:/nfs/rootfs
ip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off

jffs2文件系统命令行参数:

setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M上面 rw 代表文件系统可读可写,当你发现你制作出来的文件系统是 read-only 的时候,可能就是没设置这个参数,mem=64M 是设置内存,一般情况下内存的信息由内存 tag 设置就可以了,但是如果 u-boot 没有传入内存 tag,那么就必须设置这个参数,否则内核启动过程依旧会卡死。——忠于梦想 勇于实践