实战解析--内核移植卡在starting kernel的排查与解决
1. 问题现象与初步分析当你兴致勃勃地给开发板移植新内核串口突然卡在Starting kernel...不动时那种感觉就像等快递显示正在派送却永远等不到敲门声。最近我在瑞萨RZ系列开发板上就遇到了这个经典问题bootloader正常加载内核镜像和设备树后系统启动流程就像被按了暂停键。通过串口输出的日志可以看到整个过程停在了最关键的一步## Flattened Device Tree blob at 48000000 Booting using the fdt blob at 0x48000000 Using Device Tree in place at 0000000048000000, end 000000004800d338 Starting kernel ...这种情况通常意味着内核已经完成基础初始化但在跳转到内核主入口时遇到了障碍。根据我的经验可能的原因包括内核镜像与硬件架构不匹配比如ARM64内核跑在ARMv7芯片上设备树文件缺失或配置错误内存地址映射异常控制台驱动未正确初始化特定板级支持包(BSP)缺失2. 关键排查步骤详解2.1 验证内核与硬件匹配性首先用file命令检查内核镜像架构file arch/arm64/boot/Image正常应该显示类似Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages如果显示的是其他架构如ARM说明交叉编译工具链选错了。我遇到过有人用arm-linux-gnueabi工具链编译64位内核的案例。接着检查menuconfig配置make menuconfig确保以下关键选项正确Architecture selection → ARM64 Platform selection → Renesas RZ family2.2 设备树生成验证设备树文件缺失是最常见的坑。编译后务必检查ls -l arch/arm64/boot/dts/renesas/*.dtb如果输出为空说明设备树根本没编译。这时需要确认Makefile中CONFIG_OF和CONFIG_ARCH_RENESAS已启用检查dts文件是否存在find . -name *rz*.dts手动指定设备树编译make dtbs ARCHarm64 CROSS_COMPILEaarch64-linux-gnu-2.3 内存与启动参数检查使用bootloader如U-Boot打印环境变量printenv重点关注这些参数bootargsconsolettySC0,115200 root/dev/mmcblk0p2 rw bootcmdext4load mmc 0:1 0x48080000 Image; ext4load mmc 0:1 0x48000000 rz.dtb; booti 0x48080000 - 0x48000000常见错误包括内存地址未对齐ARM64要求2MB对齐bootargs缺少必要参数设备树加载地址与内核冲突3. 瑞萨平台特殊处理瑞萨的RZ系列需要特别注意这些坑点专用内核源码官方维护的内核不在主流kernel.org仓库必须从特定git获取git clone https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip.git外设驱动依赖比如以太网驱动需要额外补丁git apply 0001-ravb-add-RZ-V2M-support.patch时钟配置设备树中必须包含正确的时钟定义pfc { clocks cpg CPG_MOD 812; };启动调试技巧在内核命令行添加earlycon参数bootargsearlyconscif,0xe6e88000,115200n84. 进阶调试手段当基础排查无效时这些工具能救命JTAG调试连接OpenOCD调试器在内核入口设置断点b __primary_switched检查寄存器状态info registers x0 x1 x2QEMU模拟qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -kernel Image -append consolettyAMA0内核早期打印 修改内核配置CONFIG_DEBUG_LLy CONFIG_EARLY_PRINTKy5. 完整解决方案示例以瑞萨RZ/V2M开发板为例正确流程应该是获取专用源码git clone -b linux-4.19.y-cip https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip.git应用板级补丁cd linux-cip quilt import rzv2m.patch配置编译环境export ARCHarm64 export CROSS_COMPILEaarch64-linux-gnu- make rzv2m_defconfig编译生成文件make -j8 Image dtbs部署到开发板scp arch/arm64/boot/Image root192.168.1.100:/boot scp arch/arm64/boot/dts/renesas/r9a09g055*.dtb root192.168.1.100:/boot启动成功后你会看到类似日志[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034] [ 0.000000] Linux version 4.19.182-cip35 (buildci) [ 0.000000] Machine model: Renesas RZ/V2M evaluation board遇到卡住问题时不妨从最简单的hello world内核模块开始验证基础功能。我曾用这个方法发现过内存控制器配置错误最终通过调整设备树中的memory节点解决了问题。内核移植就像拼乐高缺一块积木整个系统就站不起来耐心检查每个环节才是王道。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2516410.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!