ROM中的代码是可以直接执行的,它的作用是什么?
提问:IMX6ULL芯片内部的ROM中的代码是不是也要被加载到内存(RAM)中才能运行?
答:IMX6ULL 内部 ROM 的代码 不需要被加载到内存中,它直接在 ROM 中执行。
ROM 代码的执行方式
- IMX6ULL 具有一个内置的 Boot ROM(位于芯片内部),这段代码在芯片上电或复位时直接从 ROM 执行,不会被加载到 RAM 或其他存储介质中。
- 这段 Boot ROM 代码是固定烧录在 IMX6ULL 芯片内部,不能被修改。
- ROM 代码的主要作用是:
- 读取
BOOT_MODE
设置,确定启动介质(如 eMMC、NAND、SD 卡、UART、USB 等)。 - 访问相应的存储设备,读取第一阶段的引导代码(如 SPL 或 U-Boot)到 RAM 中。
- 跳转到加载的代码执行,进入下一步引导流程。
- 读取
ROM 中的代码如何访问外部存储?
- ROM 代码直接访问外设,如 eMMC 控制器、SPI、NAND 控制器等,来读取启动设备中的引导代码。
- 由于 IMX6ULL 在上电时 RAM 还未初始化,Boot ROM 代码会使用芯片内部的 OCRAM(On-Chip RAM,大约 128KB) 来存放 SPL 或者临时数据。
- 一旦 SPL 运行并初始化外部 DRAM,后续的 U-Boot、Linux 内核等就可以使用更大的内存空间。
总结
- IMX6ULL 的 Boot ROM 代码存储在芯片内部,直接执行,不需要加载到内存(RAM)中。
- ROM 代码的作用是初始化最基本的硬件,并从外部存储(如 eMMC)加载引导代码(SPL)。
- SPL 运行后初始化 DDR,接着 U-Boot 和 Linux 继续启动流程。
ROM中的代码为什么能被直接执行
提问:IMX6ULL内部的ROM是不是因为有地址线所以存储在它里面的代码才可以不用加载到RAM中就能被执行?
是的,IMX6ULL 内部的 ROM(Boot ROM)可以直接执行,正是因为它有地址线,使得它是能 映射到处理器的地址空间 的,从而CPU 能够直接从 ROM 读取和执行指令,而无需先将其加载到 RAM 中。
1. 为什么 IMX6ULL 的 ROM 可以直接执行?
IMX6ULL 的内部 Boot ROM 是 基于地址总线的存储器,它被映射到 CPU 的物理地址空间(通常在 0x0000_0000 或特定区域)。CPU 上电复位后,直接从该地址取指令执行,无需额外加载到 RAM。
关键点
- ROM 通过地址线连接到 CPU,类似于 NOR Flash,CPU 可直接取指执行。
- ROM 的代码是出厂时写入的,不可更改,它负责 IMX6ULL 的 Boot 启动流程。
- 无需先加载到 RAM,但在 Boot 过程中,如果从 eMMC、NAND Flash、SD 卡等外部存储启动,ROM 会将 Bootloader(如 U-Boot)加载到 RAM 再执行。
2. eMMC/NAND Flash 为什么不能直接执行?
与 IMX6ULL 内部 ROM 不同,eMMC/NAND Flash 没有直接映射到 CPU 的地址空间,而是通过 SD/MMC 控制器或 NAND 控制器 访问,因此:
- CPU 无法直接从 eMMC/NAND 取指令,只能读取数据并加载到 RAM,再让 CPU 在 RAM 中执行。
- 这就是为什么 eMMC/NAND Flash 需要 Boot ROM 先加载 Bootloader 到 RAM,然后再运行。
3. IMX6ULL 的 Boot 流程
IMX6ULL 上电后,内部 Boot ROM 执行:
- CPU 复位后,自动从 ROM 预定义地址执行(无需 RAM)。
- ROM 代码检测启动模式(BOOT_MODE 引脚):
- 从 eMMC / NAND / SD / UART / USB 启动。
- 如果从 eMMC/NAND 启动:
- ROM 通过 SD/MMC/NAND 控制器读取存储设备中的 Bootloader(如 U-Boot)。
- 将 Bootloader 复制到 RAM 并执行。
- Bootloader(U-Boot)运行后,再引导 Linux 内核。
4. 结论
- IMX6ULL 的 ROM 直接映射到 CPU 地址空间,因此能直接执行,不需要加载到 RAM。
- eMMC/NAND 不能直接执行,因为它们是外部存储,CPU 需要 Boot ROM 先加载 Bootloader 到 RAM,然后才可以执行。