RISC-V架构SIFIVE启动代码流程解析
需积分: 9 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系统能够可靠且有效地运行。
2022-06-14 上传
2019-08-24 上传
2022-06-22 上传
2023-03-26 上传
2023-08-14 上传
2024-10-30 上传
2024-11-05 上传
2024-11-05 上传
2024-11-01 上传
nick-fei
- 粉丝: 1
- 资源: 40
最新资源
- MATLAB新功能:Multi-frame ViewRGB制作彩色图阴影
- XKCD Substitutions 3-crx插件:创新的网页文字替换工具
- Python实现8位等离子效果开源项目plasma.py解读
- 维护商店移动应用:基于PhoneGap的移动API应用
- Laravel-Admin的Redis Manager扩展使用教程
- Jekyll代理主题使用指南及文件结构解析
- cPanel中PHP多版本插件的安装与配置指南
- 深入探讨React和Typescript在Alias kopio游戏中的应用
- node.js OSC服务器实现:Gibber消息转换技术解析
- 体验最新升级版的mdbootstrap pro 6.1.0组件库
- 超市盘点过机系统实现与delphi应用
- Boogle: 探索 Python 编程的 Boggle 仿制品
- C++实现的Physics2D简易2D物理模拟
- 傅里叶级数在分数阶微分积分计算中的应用与实现
- Windows Phone与PhoneGap应用隔离存储文件访问方法
- iso8601-interval-recurrence:掌握ISO8601日期范围与重复间隔检查