RISC-V架构SIFIVE启动代码流程解析

需积分: 9 3 下载量 172 浏览量 更新于2024-08-05 收藏 41KB DOCX 举报
"SIFIVE的启动代码流程分析" 在RISC-V架构中,SIFIVE处理器的启动流程涉及一系列初始化步骤,确保系统能够正确地从复位状态开始运行。这个流程主要由两个关键文件控制:Entry.S和ctrl0.S。下面是详细的启动流程分析: 1. **引导流程(Bootflow)** 引导流程是自由金属(FreedomMetal)源代码的一部分,它支持单核和多核系统的引导,并包含初始化每个核心所需的所有代码。这部分流程由`ENTRYpoint`标记的`entry.S`文件开始。 2. **入口点(ENTRYpoint)** 入口点是通过`entry.S`中的`_enter`标签实现的。这里首先会使用`__global_pointer$`符号初始化全局指针(GP)寄存器,这是RISC-V架构中重要的数据访问指针。 3. **异常处理程序设置** `entry.S`还会将`early_trap_vector`写入`mtvec`寄存器,将其设置为默认的异常处理程序,以处理系统中的未预期事件。 4. **清除功能禁用寄存器(CSR0x7c1)** 清除`CSR0x7c1`寄存器,这是RISC-V的控制和状态寄存器(CSRs)之一,可能包含了某些功能的禁用标志。 5. **调用_crt0.S中的_start** 然后,程序读取`mhartid`寄存器的值并传递给`crt0.S`中的`_start`标签,开始执行更多的初始化操作。 6. **栈指针初始化** 在`crt0.S`中,根据`_sp`符号初始化栈指针`sp`。对于多核系统,每个 hart 的栈指针会根据其`mhartid`和预定义的`__stack_size`进行偏移。 7. **初始化判断** 检查当前 hart(由`mhartid`标识)是否为`__metal_boot_hart`。如果是,那么它会执行初始化代码;否则,跳过初始化,直接进入后初始化流程。 8. **数据段初始化** 初始化数据段到RAM的指定位置,确保程序的数据部分正确加载。 9. **ITIM段复制** 如果存在ITIM(即时中断定时器)代码,将其复制到目标地址,这可能涉及到处理器的中断处理机制。 10. **清零BSS段** BSS段(未初始化的数据段)会被清零,以确保所有未初始化的全局变量在程序开始时都是零值。 11. **库函数注册** 调用`atexit`库函数注册析构函数,以便在主函数退出后执行。同时,调用`__libc_init_array`,运行所有标记为`attribute__((constructor))`的功能函数,这些函数会在程序开始运行前执行,如初始化硬件外设(如PLL、UART、L2缓存等)。 12. **后初始化流程** 在这个阶段,调用`__metal_synchronize_harts`,这是一个C例程,它使得 hart0 释放其他 hart,通常是通过设置并等待`msip`位来完成的。尽管中断尚未启用,但这里`msip`被临时用作同步机制。 13. **检查misa寄存器** 最后,检查`misa`寄存器以确定浮点硬件是否可用。`misa`寄存器包含了处理器扩展的信息,包括浮点运算支持。 以上就是SIFIVE处理器启动流程的详细步骤,从初始化硬件环境到准备好执行用户程序,每个环节都至关重要,确保了RISC-V系统能够可靠且有效地运行。