uboot启动流程_RISCV64 opensbi启动过程

RISC-V64 opensbi启动过程

  • 1.说明

  • 2.环境准备

    • 2.1 交叉编译工具链

    • 2.2 源代码准备

  • 3.riscv架构 gdb调试方法

  • 4.opensbi底层初始化流程

    • 4.1 从qemu的加载执行开始

    • 4.2 opensbi底层初始化

    • 4.2 opensbi设备初始化

    • 4.3 二级boot的跳转

  • 5.小结

1.说明

最近有一些riscv的项目做,虽然以前也用过例如k210之类的riscv架构的芯片,但是都止于能够做一些应用,并未特别关注其芯片的体系架构方面的东西,但是随着接触的芯片架构的种类的逐渐的增加,发现要想使用一款好芯片的,仅仅做上层应用并不能完全发挥出特定架构芯片的全部优势。比如aarch64的el层级和虚拟化的模型,mips的mmu特性,以及sparc的窗口寄存器等等,芯片架构的特点要是能够完全的发挥出来,写起应用起来,那真是觉得很爽的事情。

目前在工作上做一些riscv项目,发现自己的积累的知识不够了,还是需要深入到底层去理解,于是需要疯狂的恶补相关的知识,看文档、读代码、每天就这样深入其中,看的多了,想法也很多,很容易就忘记了,有时也做做笔记,晚上下班后再将资料整理一下,如果觉得有些价值的东西,就编写成文章,分享经验。

学习使用riscv64的芯片的架构,首先可以了解学习opensbi,作为芯片启动的Bios,其作用不言而喻。工欲善其事,必先利其器。一个良好高效的开发环境将会使得分析代码变得得心应手。本文在Ubuntu18.04环境下进行测试,在riscv64的qemu上进行gdb的单步调试,主要分析的阶段是qemu启动后,执行到opensbi,直到启动uboot的阶段。

opensbi是研究和学习riscv底层的一个比较优秀的项目,代码量小,质量也很高,很值得推荐的一个开源项目。

关于opensbi与qemu的环境搭建,我前面的文章中已经提及,这里就不赘述了。

riscv64 qemu上进行Linux环境搭建与开发记录

2.环境准备

2.1 交叉编译工具链

如果按照之前的文章下载的Linux版本的交叉编译工具链是不带有gdb工具,所以可以下载一个bare/rtos版本的gcc。建议下载sifive的riscv的交叉编译工具链

https://www.sifive.com/software

也可以到网盘下载:

https://pan.baidu.com/s/1_C-cFBD3ADVjVFm94bYzNw 
提取码: v38x 
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Uboot中使用RISC-V的timer需要以下步骤: 1. 确认你的处理器已经支持RISC-V的标准Timer和Counter。可以通过查看RISC-V处理器手册来确认。 2. 在UBOOT的配置文件中,使能RISC-V的Timer和Counter。在`include/configs/`目录下找到你的处理器的配置文件,例如`riscv64_smode_defconfig`,打开该文件并找到以下选项并将其置为`y`(即使能状态): ``` CONFIG_SYS_TIMER=y CONFIG_RISCV_TIMER=y CONFIG_SYS_RISCV_TIMER=y CONFIG_SYS_RISCV_TIMER_ADDR=<timer_address> CONFIG_SYS_RISCV_COUNTER=y CONFIG_SYS_RISCV_COUNTER_ADDR=<counter_address> ``` 这些选项的意义分别是: - `CONFIG_SYS_TIMER`: 使能通用的系统定时器。 - `CONFIG_RISCV_TIMER`: 使能RISC-V内核计时器。 - `CONFIG_SYS_RISCV_TIMER`: 指定使用RISC-V的Timer作为系统定时器。 - `CONFIG_SYS_RISCV_TIMER_ADDR`: 指定Timer的物理地址。 - `CONFIG_SYS_RISCV_COUNTER`: 使能RISC-V的Counter计数器。 - `CONFIG_SYS_RISCV_COUNTER_ADDR`: 指定Counter的物理地址。 在这些选项中,`<timer_address>`和`<counter_address>`应被替换为你的处理器计时器和计数器对应的物理地址。 3. 在Uboot的源码中,与RISC-V Timer相关的代码位于`arch/riscv/cpu/`目录下的`timer.c`文件。在这个文件中,定义了许多与计时器相关的函数,包括初始化计时器、读取计数器值等。 4. 在需要使用Timer的地方,调用如下函数即可获取计数值: ```C uint64_t read_timer(void) ``` 这个函数返回RISC-V的计时器计数值。 以上就是在Uboot中使用RISC-V的Timer的步骤。需要注意的是,不同的RISC-V处理器可能会有不同的RISC-V Timer的实现和物理地址,因此需要根据具体的处理器手册和代码来进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值