uboot & uImage & linux启动流程

uboot & uImage & linux启动流程

通常,在嵌入式系统中,NAND 闪存分为四个部分:--

  1. 引导加载程序的分区(这里是 uboot.bin)
  2. uboot 保存环境变量的小分区
  3. 内核分区(这里是 uImage.bin)
  4. rootfs 的分区

现在我有几个问题:--

1> 32位ARM MCU有许多外部存储器接口,例如连接到它的DRAM和NAND或NOR闪存。我们的 32 位 ARM MCU 如何知道从 NAND 上的哪个地址获取 Uboot?在RAM中的哪个地址加载Uboot?

2> 在像AVR这样的8位MCU中,RESET向量地址是0x0000并且位于内置FLASH存储器中。如何为 32 位 ARM MCU 指定 RESET 向量,因为它连接了许多不同类型的外部存储器接口。

3> 如果是 32 位 ARM MCU,首先 Uboot 将进入 RAM,然后将压缩的 uimage 加载到 RAM 中,然后 uboot 将 uIMage 解压缩到 LOADADDR。那么,在定义LOADADDR(未压缩图像地址)时,我们是否必须考虑(uboot本身+要加载到RAM中的压缩uImage)的空间?我们如何使用 uImage 来定义 LOADADDR ?

4> linux uImage 是否嵌入了 rootfs 或者它是一个单独的实体?如果 rootfs 是位于 NAND 上的独立实体,那么内核如何知道 rootfs 位于 NAND 上的哪个地址?

答案1

1) 通常,参考手册中定义的每个可启动接口都会有一个偏移量。例如,您可能能够从内存映射的 NOR、NAND 等启动。例如,NOR 可能是 0x1000,NAND 0x4000。参考手册中关于启动的章节会告诉你。

2) 见1

3) 通常,uboot 不能只是“进入 RAM”。这必须通过第一阶段引导加载程序来完成。 U-boot 具有 SPL(辅助程序加载器)功能来执行此操作。该 SPL 的工作是在处理器 SRAM 之外执行并初始化系统 DRAM,以便随后可用于加载完整的 U-boot 可执行文件。然后,U-boot 将需要适合您正在使用的板/芯片的 LOADADDR。 U-boot 在启动时不会解压缩内核。由于遗留原因,这通常是内核本身的工作。显然,您的内核应该能够适合您的内存,并且您可能需要确保当内核解压自身时不会覆盖其他组件(rootfs、设备树)。

4) 任一选项均存在且有效。如果 rootfs 是独立的,您需要知道它是什么类型的文件系统。如果它是 initramfs,您可以定义它在原始 NAND 中的存储位置。如果它是持久文件系统(ext4),则 U-boot 需要知道如何处理分区映射。完成后,您实际上将设备路径而不是地址传递到内核中。

相关内容