自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 RISCV GCC编译时指定生成的指令集

如果匹配之后运行还出错,比如:riscv64-unknown-linux-gnu-gcc -march=rv64imaf -mabi=lp64 *.c。上面那种情况报错是因为链接的时候出错导致,使用下面的-C只编译不链接就OK了。可以看出编译配置没有问题,是链接库不匹配导致。链接库不匹配,是在编译riscv gcc工具链的时候,重新编译工具链,选择multilib即可编译出支持多个库的gcc。参数指定目标指令集和应用程序二进制接口(ABI)。编译时,可以通过 -march。若代码使用浮点指令但未启用。

2025-04-10 09:56:00 547

原创 riscv gcc 5 增加自定义指令集

本方案介绍了GCC编译器的整体流程,提出了编译器优化的目标,并给出了实现这一目标的方法,文中还深入分析了编译器的中端和后端优化,在修改过程中使用仿真器可以完全保证中端优化的正确性及性能检测,但是中端优化效果与后端相比不显著。由于GCC良好的设计框架,GCC的中间处理与目标处理器完全独立,因此,GCC移植到新的目标处理器只需要对 GCC的后端进行扩充,使之能够为新的目标系统生成代码。以上信息在GCC提供的移植接口中通常以宏定义的方式给出,这些预定义宏的总体数量有几百个,功能繁杂,理解起来有一定的困难。

2025-04-08 08:55:38 96

原创 RISCV GCC 4 后端优化

如果目标处理器有一个均一的寄存器集合,那么指令选择器可以假定寄存器供应是无限的,并依赖寄存器分配器来插入load/store指令(从而将无限的虚拟寄存器集合匹配到有限的物理寄存器集合)。窥孔优化的核心思想:使用一个滑动窗口(或称为“窥孔”)在指令上面移动,对窗口内相邻指令构成的短序列或者模式进行分析,寻找可以可以改进的特定序列,如果识别出一个指令序列与另一个更高效的指令序列等价(该序列就是特定序列),则用这个等价序列对原序列进行替换,原序列的存在若没有意义(如mov r0, r0),则可以将其删除。

2025-04-08 08:54:04 117

原创 RISCV GCC 3 中端优化

该结构体是所有GIMPLE存储结构体的“基类”,描述了GIMPLE语句的基本特性,例如,GIMPLE_CODE、操作数个数、源文件中的位置以及语法块信息等,其中的code 字段描述的是所存储的GIMPLE语句的类型(即GIMPLE_CODE),这些GIMPLE_CODE的值由枚举类型 enum gimple_code 描述;在编译器的优化过程中,中端优化涉及到多种技术和策略,有些优化是有依赖性的,有些优化是需要进行多次执行,不同的优化方案,优化顺序也有所不同,因此中端优化没有一个固定的流程。

2025-04-08 08:50:44 28

原创 RISCV GCC 2

(2)HOST与TARGET相同,但HOST与BUILD不同(生成native gcc),这是一种典型的生成交叉编译工具的情况,即在BUILD主机环境上编译GCC源代码,生成的编译器程序将运行在HOST主机环境中,并且该编译器程序编译生成的目标文件也将运行在HOST,即TARGET环境中。(1)BUILD、HOST、TARGET三者相同,这一般表示在本机进行GCC源代码的编译生成的编译器程序GCC也运行在与本机相同的机器和操作系统平台下,并且生成的编译器编译出的目标程序也将运行在同样的系统环境中。

2025-04-08 08:48:44 25

原创 RISC-V GNU工具链优化方案

RISC-V GNU工具链是一套用于RISC-V架构的交叉编译工具集,它使得开发者能够在一个宿主系统上编译出适用于RISC-V处理器的程序。这个工具链包括了编译器、汇编器、链接器、调试器及其他辅助工具。编译器优化对程序运行性能提升是有很大的帮助的,根据CPU的指令发射宽度、各种资源的个数(加法单元,乘法单元的数量等)、流水线深度、指令的列表、每条指令的使用的资源以及延迟信息等对编译器进行优化可以显著提升程序的性能。

2024-11-14 18:14:39 497

原创 riscv u-boot的hart_lottery机制

在多cpu中,第一个运行到这个位置的cpu(cpu0),t0为hart_lottery的地址,里面存储了0,amoswap.w.aqrl s2, t1, 0(t0)后使得s2存储了0,同时hart_lottery的地址里存储了t1的内容,这里t1在前面的代码赋了非0值,因此hart_lottery的地址里非0,因此cpu0中s2=0,不会到wait_for_gd_init。这段代码实现了一个自旋锁的获取过程。:在多核系统中,如果不同的Harts尝试同时访问同一资源(如内存、外设等),可能会导致资源冲突。

2024-11-07 19:27:56 695

原创 关于多核或者多路运行的软件方面的问题

根本原因是仿真平台的多核堆栈设置了相同的地址,案例中写数据和读数据是用函数封装的,会调用大量的堆栈。而不同的核使用相同的堆栈,当不同的核运行的快慢不同时,堆栈地址会交互,这时候堆栈内容会错误;但是写的过程中遇到了写的data和address不匹配的问题,案例很简单,就是简单的写了读,读了写。我怀疑硬件没接好,总线数据出现了问题。仿真过程遇到了问题,案例为使用不同的核进行写,然后读出来看数据对不对,缓存一致性是否正确。(2)不同的核使用不同的堆栈地址,完全错开,也就不会产生写交叉的问题了。

2024-11-02 09:19:05 224

原创 解决RISC-V链接时 linker fail, relocation truncated to fit: R_RISCV_HI20

(2)将riscv_gnu_toolchain下面的Makefile里-mcmodel=medlow改为 -mcmodel=medany,重新make工具链,使用这个工具链再重新进行链接就通过了。对于使用-mcmodel=medany的64位架构,代码可以链接到任何基址,但链接的全局符号遵循类似的+/- 2GiB范围限制。此外,如果您正在链接任何预编译的库,如C库,那么工具链必须已经配置好了-cmodel=medany,否则C库将是medlow代码,无法工作。折腾了很久,没搞好,终于搞好了,记录一下。

2024-10-31 18:10:28 585

原创 要在目标机上运行交叉编译后的SPEC CPU2006基准测试并获取报告

通过这些步骤,你可以在QEMU模拟的RISC-V环境中成功运行SPEC CPU2006基准测试并获取报告。通过这些步骤,你应该能够找出无法进入内核的原因,并成功启动RISC-V系统。如果你不确定问题出在哪里,可以尝试使用预编译的RISC-V镜像来验证你的QEMU配置是否正确。将编译好的文件传输到目标机(QEMU模拟的RISC-V环境)。在目标机上,确保设置正确的环境变量,以便能够找到运行benchmark所需的库和工具。• 内核:确保内核是为RISC-V编译的,并且支持你所使用的QEMU虚拟机配置。

2024-10-26 16:03:28 1061

原创 u-boot第一阶段启动过程

第一阶段主要完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。它是自动生成的,生成的源码包括start.S, uart驱动文件,sd(SPI)驱动文件,设备树等。a.根据链接脚本,使用gcc把汇编代码,编译为elf格式的目标文件。· 为加载u-boot的第二阶段代码准备RAM空间。d.把img文件中的内容复制到bootrom.sv中。· 复制u-boot的第二阶段代码到RAM空间中。

2024-10-25 10:54:08 343

原创 risc-v系统启动流程

riscv 系统启动

2024-10-25 10:47:30 1358 2

原创 qemu简介

当QEMU用作虚拟器时,QEMU的优点在于其实纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,但是也正因为QEMU是纯软件实现的,因此所有指令都需要QEMU转手,因此会严重的降低性能。而可行的办法是通过配合KVM或Xen来进行加速,KVM 是硬件辅助的虚拟化技术,主要负责比较繁琐的CPU 和内存虚拟化,而 QEMU 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。为了方便调试和分析,QEMU 提供了 Trace功能,可以跟踪和记录指令的执行过程,从而实现对虚拟机的深入分析和性能优化。

2024-10-25 10:27:03 593

原创 riscv-gcc扩展指令修改

打开 riscv-tools/riscv-opcodes/opcodes文件,在这里,将能够看到分配给各种指令的各种操作码和指令位。1.4将指令类型、寄存器加入文件riscv-binutiles/ opcode/riscv-opc.c中,riscv_kvec_names_numeric(kp0。1.5增加寄存器需要修改riscv-binutiles/gas/config/tc-riscv.c中如下两个函数。加入文件riscv-binutiles/include/opcode/riscv-opc.h这。

2024-10-25 10:12:44 489 5

原创 多路原子指令

1. 保证操作的原子性:原子指令确保了在多线程环境中,当多个线程访问某个类时,如果这个类中的所有操作都可以保证以原子方式执行,那么这个类是线程安全的。原子操作是指不可分割的操作,要么全部完成,要么完全不做。原子指令在多路并发环境中扮演着至关重要的角色,它们确保了在多线程或多处理器系统中对共享资源的访问是安全的,避免了数据竞争和不一致性的问题。9. 跨平台性:虽然某些原子操作可能依赖于特定的硬件或操作系统支持,但许多现代编程语言和库提供了跨平台的原子操作实现,使得开发者可以在不同的平台上实现一致的并发控制。

2024-10-24 22:57:22 254

原创 调试软件和调试系统

使用PC上的Linux里的DebugServer和GDB对一颗RISC-V SoC芯片进行debug, RISC-V芯片在开发板上,开发板和PC之间使用下载器,下载器一端连接开发板上连出的JTAG端口,一端连接PC上的USB接口。RISC-V SoC芯片:里面有RISC-V core,和SoC中的debug module相连,这个debug module对内控制RISC-V core、读取寄存器、访问memory,对外和JTAG控制器连接,JTAG控制器的接口连到芯片的PAD。

2024-10-24 09:04:52 241

原创 为什么riscv native gcc运行时需要指定sysroot

在RISC-V GCC编译器中是必要的,因为它确保编译器可以找到正确的系统头文件和库文件,以生成与目标RISC-V平台兼容的代码。:由于RISC-V GCC编译器是在宿主机上运行,但生成的代码是为RISC-V目标平台设计的,因此需要。通常指向一个包含RISC-V系统头文件和库文件的目录,这些文件是编译RISC-V程序所必需的。选项指定系统根目录。可以帮助编译器区分不同架构的库和头文件,确保为特定的RISC-V架构选择正确的文件。,编译器可以找到正确的库和头文件,确保编译出的程序能够在目标平台上正确运行。

2024-10-23 17:10:58 608

转载 gdb和gdbserver源码架构分析

b) _initialize_remote->init_remote_ops接口初始化了remote_ops变量,接着调用add_target 这个接口比较特殊,也比较重要,调用 add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);e) remote_fetch_registers接口负责获取远程寄存器,会被target_fetch_registers接口间接调用到.

2024-10-23 17:01:19 129

原创 ACE协议中的DVM事务(二)

它们负责管理内存页的分配、迁移和回收,确保系统中的内存使用是最优的,并且当一个节点的内存不足时,可以将内存页移动到其他节点上。通过在节点之间分布内存页,DVM事务有助于实现负载均衡,防止某些节点过载而其他节点资源闲置的情况。此外,通过优化内存页的分布,DVM事务可以减少内存访问延迟,提高缓存命中率,从而提升系统的整体性能。总的来说,DVM事务在ACE协议中扮演着重要的角色,它们使得系统能够有效地处理虚拟地址到物理地址的映射,以及内存资源的分配和管理,从而提高系统的整体性能和资源利用率。

2024-10-22 16:56:37 504

原创 riscv-gnu-toolchain工具链

是一个用于 RISC-V 架构的 GNU 工具链,包含了多个工具和库,主要用于编译、调试和运行 RISC-V 程序。通过上述步骤,你可以在系统中安装并配置 RISC-V GNU 工具链,开始进行 RISC-V 程序的开发和调试。这些工具和库共同构成了一个完整的开发环境,支持从代码编写、编译、链接到调试和运行的整个过程。

2024-10-22 16:54:25 512

原创 ACE协议的DVM事务

在ACE(AXI Coherency Extensions)协议中,DVM(Distributed Virtual Memory)事务是用于管理和维护分布式虚拟内存系统的关键机制。DVM事务允许系统中的不同节点共享一致的虚拟内存视图,从而提高性能和安全性。

2024-10-21 17:25:19 1083

原创 riscv fence指令使用案例

例如,在多核环境中,当一个核心进行了对共享内存的写操作后,使用。在嵌入式系统中,当CPU处理来自外设的中断时,需要确保在发送中断完成信号之前,所有相关的I/O操作都已经完成。指令,处理器可能会提前执行一些后续的I/O操作,导致系统认为中断处理尚未完成,从而产生不一致或错误的行为。指令,可以避免因指令乱序执行导致的系统不一致或错误行为,提高系统的稳定性和可靠性。指令,可以保证中断完成信号是在所有相关的中断处理操作完成后才发出的。指令之前的读和写操作完成后,后续的读和写操作才能执行。指令来做内存访问的同步。

2024-10-21 13:46:43 907

原创 riscv kernel会什么时候调用opensbi的代码

在RISC-V架构下,Linux内核会在多种情况下调用OpenSBI的代码。OpenSBI(Open Source Supervisor Binary Interface)是RISC-V平台上提供M模式(Machine Mode)服务的固件,它允许S模式(Supervisor Mode)的操作系统通过SBI(Supervisor Binary Interface)与M模式进行交互。指令进入M模式,触发SBI调用。具体的SBI扩展ID和功能ID决定了调用的具体服务。

2024-10-21 11:32:16 887

原创 *(int *)(void*) 0x80000000=0x2d70和*(volatile uint32_t *)0x80000000 =0x2d70有什么区别

这行代码直接将地址 0x80000000 转换为指向 volatile uint32_t 类型的指针,然后通过解引用操作符 * 将地址 0x80000000 处的值设置为 0x2d70。类型的指针,然后再将 void* 类型的指针转换为 int* 类型的指针,最后通过解引用操作符 * 将地址 0x80000000 处的值设置为 0x2d70。第二行代码中使用的是 uint32_t 类型,这明确指定了数据的宽度和符号性,而第一行代码中的 int 类型的大小和符号性可能依赖于编译器和平台。

2024-10-19 14:05:30 152

原创 GCC学习(9)

添加一条指令:

2023-03-03 11:31:10 192

原创 GCC学习9

GCC学习

2023-02-24 15:36:58 725

原创 GCC学习(1)

GCC学习(1)

2023-02-24 10:56:57 121

转载 NX(No-eXecute)的实现分析 gcc

NX(No-eXecute)的实现分析

2023-02-21 15:22:03 716

转载 ELF文件格式的详解

ELF文件格式的详解

2023-02-16 11:24:14 956 1

SG2042 Technical Reference Manual

SG2042 Technical Reference Manual

2024-10-26

XuanTie+Linux+开发平台使用说明

XuanTie+Linux+开发平台使用说明

2024-10-26

arm-trusted-firmware-master

arm firmware

2024-10-25

riscv-interrupts

riscv-interrupts

2024-10-25

T-HEAD+CPU调试技巧

T-HEAD gdb riscv

2024-10-25

openc910-datasheet.pdf

RISC-V openc910

2024-10-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除