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

本文探讨了Linux启动时卡在“Uncompressing Linux... done, booting the kernel.”的原因及解决方案,包括机器码不匹配、串口配置错误及关键配置缺失等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核启动卡在Uncompressing Linux..... done, booting the kernel.这好像是个老生常谈的问题了。成因在网上也罗列了很多种,可这次我碰到的,却没百度出解决方法,纠结了我很久才解决。

我先把造成Uncompressing Linux..... done, booting the kernel.的常见的几种可能再罗列一下

1、机器码不匹配

解决方法:在配置内核时开启debug 

Kernel hacking -> Kernel low-level debugging functions 是打开的
 Kernel hacking -> Kernel low-level debugging messages via S3C UART 也是打开的

在Device Drivers->Character devices->Serial drivers中选择加载Samsung SoC serial support ,然后再选上Support for console on Samsung SoC serial port 。
如果是机器码不匹配的问题,就会出现相关打印信息例如

Machine configuration botched (nr 182), unable to continue.

核对一下你的uboot机器码是否匹配。

如果不匹配,你可以修改uboot include/asm-arm/mach-types.h 文件中有关机器码的定义。或者修改内核 arch/arm/tools/mach-types 文件。

在新内核移植时有关机器码的修改步骤及分析如下:

修改机器码,机器码在2/arch/arm/mach-s3c2440/mach-test2440.c文件中MACHINE_START(TEST2440, "TEST2440")这一行定义的,第二个参数无所谓,重要的是第一个参数,在gcc编译这个mach-test2440.c的时候,会把TEST2440匹配到/include/asm-arm/mach-types.h中的"#define MACH_TYPE_TEST2440 N"这里, 如果在mach-types.h中找不到MACH_TYPE_TEST2440的定义, gcc编译mach-test2440.c则报错;
还有,/include/asm-arm/mach-types.h是每次make zImage过程中, 由arch/arm/tools/mach-types文件生成的,
总结,修改机器码,涉及内核代码的三个地方,MACHINE_START宏,mach-types.h,mach-types,初启动时,bootloader向内核传递一个机器码。

 

2、串口配置不正确

确保在配置内核时选上了在Device Drivers->Character devices->Serial drivers中选择加载Samsung SoC serial support ,然后再选上Support for console on Samsung SoC serial port 。

3、arch/arm/mach-s3c2440/Kconfig配置文件设置出错,某项关键选项没选上。

这个情况在网上不多见,但是一出错就会让人很纠结。如果芯片级或板级关键配置没选上或导致内核启动进入start_kernel函数之前就进入死循环。如果芯片级的配置没选上,会在内核执行完cpu id号匹配函数__lookup_processor_type()后进入死循环,这种情况你无论怎么配置内核的debug,串口都不会再有打印信息输出了。只有点个灯之类的才能跟踪代码的执行。

这种情况往往在打印Uncompressing Linux..... done, booting the kernel后就无任何输出了,即便你配置了debug。

我碰到这种情况是因为我在arch/arm/mach-s3c2440/Kconfig 上没有select ARCH_S3C2440。

导致Uncompressing Linux..... done, booting the kernel 卡住的大致就这几种情况。

### Linux 启动问题与引导加载程序 #### 解决 Uncompressing Linux... done, booting the kernel 的问题 当遇到 `Uncompressing Linux..................................................done, bootting the kernel.` 停滞不前的情况,这通常意味着内核已经解压完毕但未能成功启动。可能的原因包括但不限于内存不足、文件系统损坏或硬件兼容性问题[^1]。 对于此类问题的排查方法如下: - **检查日志**:通过串口连接或其他方式获取更详细的启动日志信息。 - **更新固件/驱动**:确保使用的U-boot版本是最新的,并且所有必要的设备驱动都已加载。 - **验证镜像**:确认所使用的Linux内核映像是完整的并且适用于当前平台。 #### 使用 Systemd 工具分析启动性能 Systemd 提供了一系列命令用于诊断和优化系统的启动过程。例如,`systemd-analyze time` 可以显示整个启动过程中各个阶段花费的时间;而 `systemd-analyze blame` 则能指出哪些服务消耗了大量的启动时间[^4]。 ```bash # 显示总的启动时间和各部分耗时详情 $ systemd-analyze time # 查看具体的服务及其对应的启动延迟 $ systemd-analyze blame ``` 这些工具不仅有助于理解启动流程中的瓶颈所在,还可以帮助识别潜在的问题源并采取相应的措施加以改进。 #### 调整 RTC 设置加速启动速度 禁用“从RTC设置系统时间”的选项可以在一定程度上加快启动速度。可以通过修改BIOS配置或者在初始化脚本中加入特定指令来实现这一点。比如,在某些情况下执行 `hwclock -s` 替代默认行为能够减少不必要的等待时间[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值