-1

在 ARM 板上解压内核映像 (uImage) 后,start_kernel() 函数未调用:

为什么 start_kernel() 函数没有调用?我知道它应该从文件arch/arm/kernel/head.s调用。

解压 uImage 并调用 start_kernel() 后会发生什么序列?

4

2 回答 2

0

嵌入式 Linux 的启动分 3 步完成:

  1. 引导加载程序

    • 低级硬件初始化
    • 将 Linux 内核加载到 RAM 中并将控制权交给 Linux
  2. 引导加载程序(在 Linux 内核映像内):

    • 解压并重定位内核
    • 将控制权交给它
  3. Linux内核:

    • 通过运行 start_kernel() 启动系统,最后会产生init进程

您的输出介于第 2 步和第 3 步之间(即内核解压缩)。

你可能没有设置所有的东西来拥有一个工作控制台:

  1. 通过make menuconfig中的串行控制台编译目标 Linux 内核使能

    Device Drivers -> Character Devices -> Serial Drivers
    
  2. 在内核配置中启用串行通信的特定驱动程序(即,通过make menuconfig

  3. 通过在U-Boot的bootargs变量中设置选项console=device,baudrate在正确的设备上设置 Linux 控制台。

于 2013-11-07T08:00:48.427 回答
0

在“Uncompressing Linux... Ok, booting the kernel”之后引导停止的最常见原因是内核命令行中的控制台设备不正确。例如,从 2.6.35 升级到 3.19.5 后,控制台设备名称可能已从 更改/dev/ttyAM0/dev/ttyAMA0(在 i.MX23/28 上)。您还应该检查内核命令行中控制台设备名称后面的串行端口设置(如果有)是否正确。

检查您是否通过引导加载程序传递了有效的 ATAG 阵列或设备树 (*.dtb) 文件。

另一个可能的原因是不正确的入口点。

尝试搜索引擎短语“ARM 启动在 'Uncompressing Linux....done, booting the kernel' 后挂起”

于 2013-11-07T03:37:02.120 回答