U-boot board_init_f与board_init_r阶段任务详析:内存布局与功能对比

5星 · 超过95%的资源 需积分: 42 8 下载量 67 浏览量 更新于2024-08-05 1 收藏 90KB DOCX 举报
在U-Boot启动流程中,board_init_f和board_init_r阶段各自承担着关键的任务,这些任务的执行顺序对于确保系统稳定性和性能至关重要。board_init_f(First Init Function)阶段主要负责以下几项工作: 1. **Setup Mon Len**:计算U-Boot程序的长度并将其存储在gd->mon_len中,这对于后续内存管理至关重要。 2. **FDT Setup**:验证设备树(Device Tree)的有效性,设备树是Linux内核与硬件交互的关键配置文件,确保硬件配置的正确性。 3. **InitfMalloc**:分配堆空间,堆是动态内存的一部分,用于存放程序运行时创建的对象,如函数调用的局部变量等。 4. **Log Init**:初始化系统的日志功能,使得调试和故障排查更为方便。 5. **Console Record Init**:初始化控制台存储空间,保证命令行交互的正常运行。 6. **Arch CPU Init**:针对特定处理器架构(这里是RISC-V CPU)进行初始化,包括CPU核心配置和初始化。 7. **Initf_DM**:创建设备模型,这是硬件抽象层的一部分,简化了硬件驱动的编写和管理。 8. **Arch CPU Init_DM**:进一步初始化设备模型下的RISC-V CPU设备,细化硬件支持。 9. **Env Init**:初始化环境变量,通常包含板载设备和配置信息。 10. **Init Baud Rate**:设置通信端口的波特率,确保数据传输速度一致。 11. **Serial Init**:设置串口参数,用于与外部设备通信。 12. **Console Init_f**:控制台设备的完整初始化,包括配置和初始化输入输出设备。 13. **Display Options**:显示U-Boot版本信息,提供关于当前加载版本的反馈。 14. **Display Text Info**:展示调试信息,帮助开发者诊断问题。 15. **Print CPUinfo**:显示CPU的详细信息,包括型号、频率等。 16. **Show Board Info**:展示开发板的特定信息,如制造商、型号等。 17. **DRAM Init**:根据设备树中的内存信息,确定RAM的起始地址和大小,并将gd->ram_size和gd->ram_base填入。 18. **Relocation Address**:设置重定位目标地址,将U-Boot映射到DDR内存的末尾,便于内存管理。 19. **Fix FDT**:进行单板特定的设备树操作,可能涉及硬件特有的修改或扩展。 20. **Memory Alignment**:确保gd->relocaddr对齐到4k,利于内存访问效率。 21. **Video & Trace Memory**:预留视频和追踪(可能的调试工具)内存,虽然未定义,但体现了预留策略的完整性。 22. **U-Boot Code Space**:为U-Boot本身代码预留空间,并更新gd->start_addr_sp。 23. **Heap Memory**:为堆分配内存空间,保证程序运行所需。 24. **Reserve Malloc**:为堆预留地址,调整gd->start_addr_sp。 通过board_init_f阶段的执行,U-Boot完成了基础的硬件配置、内存管理和初始化工作,为后续引导流程的顺利进行打下了坚实的基础。相比之下,board_init_r阶段可能涉及更复杂的操作,如引导内核、加载文件系统等高级任务。理解这两个阶段的职责划分有助于深入掌握U-Boot的启动流程和优化。