不少用户在尝试引导内核的时 候,遇到了一些意外,内核的引导在某一点突然中断,并且不能进行下去,有时候是有个软件的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 

然后重启,我这里截个图
 

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

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

setenv machid af0

saveenv

重启

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

好了...

原因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是调试串口,你要根据你实际情况进行配置。

 

原文链接:

不详,侵删

相关文章:

  • 2022-12-23
  • 2021-06-22
  • 2021-08-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-08
猜你喜欢
  • 2022-01-05
  • 2021-07-24
  • 2022-12-23
  • 2022-12-23
  • 2021-10-10
  • 2021-10-31
  • 2022-03-07
相关资源
相似解决方案