kernel starting 内核引导失败常见解决办法

       内核引导常见问题

Kernel - Common Problems Booting Linux

                                     作者:卢浩

                                     时间:2012.3.9

                                     转载请注明出处

                     嵌入式爱好者开发群:122879839

   不少用户在尝试引导内核的时候,遇到了一些意外,内核的引导在某一点突然中断,并且不能进行下去,有时候是有个软件的bug导致的,而有时候可能是由于内核的错误的配置导致的,这篇文章是为开发者提供一些帮助来诊断为什么不能正常引导内核并且找出其中可能的原因。

问题1:内核只引导到"Starting Kernel...",然后串口终端就没有输出了,举个例子:

## Booting kernel from Legacy Image at 80300000 ...

Image Name: Linux-2.6.31

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1750680 Bytes = 1.7 MB

Load Address: 80008000

Entry Point: 80008000

Verifying Checksum ... OK

Loading Kernel Image ... OK

OK

Starting kernel ...

到这里,串口终端就没有再输出任何信息了.

以上的串口输出信息是uboot的引导过程,至于这个starting kernel其实是uboot阶段输出最后的一句信息,这时候正准备进入内核引导。这个错误一般由于错误的配置debug串口导致的,你可以检验下你内核配置的时候,你所配置的串口输出端口是多少。打个比方,你用的是TI的omap3的beagle-board板子,其中UART3被用来输入调试信息,那么你打开linux-2.6.37(打个比方是这个版本的内核)下的.config文件,你会看到以下信息:

# CONFIG_OMAP_LL_DEBUG_UART1 is not set

# CONFIG_OMAP_LL_DEBUG_UART2 is not set

CONFIG_OMAP_LL_DEBUG_UART3=y

你会看到串口3是被设置为调试的串口。现在我们需要修改串口为默认的串口,在make menuconfig下面,"System Type --> TI OMAP Implementations --> Low-level

debug console UART".选择这个,这个就是默认用来调试的串口,修改完之后你应该就可以看到串口引导内核的输出信息了。

问题2:内核只引导到""booting the kernel",然后串口终端就没有输出了,举个例子:## Booting kernel from Legacy Image at 80300000 ...

Image Name: Linux-2.6.31

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1750680 Bytes = 1.7 MB

Load Address: 80008000

Entry Point: 80008000

Verifying Checksum ... OK

Loading Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux.............................................................

................................................. done, booting the kernel.

这种情况的发生可能有好几个原因,以下是常见的一些原因:

原因1:串口控制台参数设置不正确,打个比方你用的是TI的omap3的beagle-board板子,其中串口选择的是UART3,那么串口的配置应该是 115200波特率,数据位为8,校验位为0(none),流控制为0(none)。因此,如果你的设置是正确的,你应该能够看到类似以下的信息:

OMAP3 beagleboard.org # printenv bootargs

bootargs=console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait

这个要区分大小写,确定你输入是正确的,而且没有空格。

在linux-2.6.36及更新的版本里,我们使用ttyO2来代替ttyS2,这是大写字母O,不是阿拉伯数字0.

为了避免这种错误,你可以使用TI SDK包里面的/ezsdk/bin里面的脚本来设置env变量。

原因2:不匹配的uboot和kernel的机器号

这里我就不用TI的翻译的了,我前阵子刚写过一篇关于机器号的文章,直接copy过来就是了,大体意思和TI的是差不多的。

我以前写过一篇关于设置ubootkernel的机器号对应的问题。今天我才发现一个比较简单的方法。

一般可以完全不用那么麻烦改源码什么的。

当你uboot起来之后,在uboot状态下。打个比方啊

setenv machid 7d9

然后saveenv 

然后重启,我这里截个图


OK了,我们会发现刚才输入的那个机器号是错的,系统并且提示我正确的可用的id号是af0.然后再输入

setenv machid af0

saveenv

重启

如图


好了...

原因3:软件的bug

如果以上的办法没能帮助你解决问题,那么你就要在内核的源码里做一些工作了,请在内核源码中使能CONFIG_DEBUG_LL,来确定内核在哪里引导失败了,这个会打印更多的信息来帮助你确定内核到底在哪里出了问题。如果你没能取得进一步的发现,那么更多的信息可以帮助其他开发者来挖掘这个问题。

问题3:在内核引导成功之后没有信息输出。

举个例子:

Sending DHCP requests .<6>eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1

., OK

IP-Config: Got DHCP answer from 255.255.255.255, my address is 128.247.107.23

IP-Config: Complete:

device=eth0, addr=128.247.107.23, mask=255.255.254.0, gw=128.247.106.2,

host=128.247.107.23, domain=am.dhcp.ti.com, nis-domain=(none),

bootserver=255.255.255.255, rootserver=128.247.107.35, rootpath=

Looking up port of RPC 100003/2 on 128.247.107.35

Looking up port of RPC 100005/1 on 128.247.107.35

VFS: Mounted root (nfs filesystem).

Freeing init memory: 136K

init started: BusyBox v1.11.1 (2008-10-05 04:40:51 CDT)

starting pid 288, tty : '/etc/init.d/rcS'

System initialization...

Hostname : OMAP3EVM

Filesystem : v1.0.0

Kernel release : Linux 2.6.22.18-omap3

Kernel version : #12 Mon Oct 6 01:22:49 CDT 2008

Mounting /proc : [SUCCESS]

Mounting /sys : [SUCCESS]

Mounting /dev : [SUCCESS]

Mounting /dev/pts : [SUCCESS]

Enabling hot-plug : [SUCCESS]

Populating /dev : [SUCCESS]

Disabling Power mgmt : [SUCCESS]

Turn off LCD after 1 hour : [SUCCESS]

Mounting other filesystems : [SUCCESS]

Starting syslogd : [SUCCESS]

Starting telnetd : [SUCCESS]

System initialization complete.

Please press Enter to activate this console

这边的意思是让你按下enter键来激活控制台

但是如果你没有看到以上的信息,你就无法输入enter来激活了,请看下TI的WIKI关于文件系统的制作http://processors.wiki.ti.com/index.php/Creating_a_Root_File_System_for_Linux_on_OMAP35x#Configure_the_New_Target_Root_File_System

如果按照上面的来制作一个文件系统,那么你可以看到/etc/inittab这个文件下面有以下代码;

::sysinit:/etc/init.d/rcS

# /bin/ash

#

# Start an "askfirst" shell on the serial port

ttyS0::askfirst:-/bin/ash

# Stuff to do when restarting the init process

::restart:/sbin/init

# Stuff to do before rebooting

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff -a

在这种情况下,请更正上面的ttyS0为ttyS2。然后就OK了。这里的ttyS2是调试串口,你要根据你实际情况进行配置。


  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值