开源浮点运算库SoftFloat SoftFloat是一个开源的、跨平台的、高效实现IEEE 754单精度和双精度浮点数运算的C代码库。该项目由John L. Hennessy教授领导的斯坦福大学计算机系统实验室开发。它提供了完整的API接口,可以方便地集成到各种应用中。目前最新版是,2018.1月发布的softfloat 3e。1rfz。
QEMU中GDB远程串行协议 GDB(GNU Debugger)是一个强大的代码调试工具,它提供了一种使用串行通信协议进行远程调试的方法。在GDB中,可以通过GDB服务器和GDB客户端进行远程调试。其中,GDB远程串行协议允许GDB客户端通过串行连接(如USB或TCP/IP)与GDB服务器通信。GDB远程串行协议的主要作用是:允许开发者在一个系统(通常是开发主机)上,调试另一个系统(通常是目标设备)上运行的程序。这在调试嵌入式系统或需要物理访问硬件的情况下特别有用。
RISC-V特权架构 - 时钟中断处理 经过对MTI和STI中断的处理分析,发现两者的查询处理逻辑,其实是一样的。其处理流程,总结为以下几个步骤(以XXI:检查确保XXI中断使能,且该中断被触发根据运行模式,检查全局中断开关检查mstatus.mie:禁用M全局中断,不处理:使能M全局中断,继续检查委托:不委托,陷入M:委托到S,陷入S检查mstatus.sie:禁用S全局中断,继续检查委托:不委托,陷入M:委托到S,不处理:使能S全局中断,继续检查委托:不委托,陷入M:委托到S,陷入S。
解决QEMU无法从非0x80000000处开始执行 将benos_payload.bin,放置在NEMU中内存0x80000000处,NEMU通过Socket发送放置到QEMU中内存0x31e00000处。计划让QEMU直接从0x31e00000开始执行,而不是常规的0x80000000。对NEMU源码,做了如下修改。...// 将benos_payload.bin发送到QEMU的0x31e00000内存处// pc寄存器设置为0x31e00000// 将NEMU的x0 ~ x31和pc寄存器值,发送到QEMU中,覆盖QEMU原有寄存器。
解决QEMU执行mret指令无法跳转到0x80200000 将benos_payload.bin,分别放置在NEMU与QEMU中的内存0x80000000处,并计划两者同时从0x80000000开始运行,期间运行到0x800000a8处(mret指令)时,下一条指令,预期均会跳转到0x80200000处,继续取指执行。而QEMU执行mret指令后,却无法跳转到0x80200000处,QEMU直接跳转到了0x80200100处(对于高版本QEMU(我用的7.1.0),会检查PMP配置,因此需要在SBI中初始化PMP才能运行。
QEMU模拟器源码编译与使用 那么,如果我们知道与gdb server的数据包协议,是不是就可以编写一个程序,去控制QEMU的单步执行,以及获取CPU寄存器、内存等,是的,这是可行的。上述步骤,编译的QEMU,直接就可以gdb调试,只是有一些还是有所优化,如果要完全无优化,可能还需要自己配置再重新编译。将mysbi.bin、benos.bin、benos.elf,拷贝到qemu-7.1.0/build/目录下。需要在QEMU中运行的文件有:mysbi.bin、benos.bin、benos.elf。运行,即可在该断点处停住。
RISC-V在线反汇编工具 RISC-V在线反汇编工具:https://luplab.gitlab.io/rvcodecjs/#q=34179073&abi=false&isa=AUTO似乎,只支持RV32I、RV64I、RV128I指令集:
搭建NEMU与QEMU的DiffTest环境(Socket方式) NEMU可以调用gdb_getregs函数,从QEMU获取到寄存器数据,一共528字节,每个字节为"0" ~ "9"或"a" ~ "f"之间的任一字符,每16个字节表示一个寄存器值,共表示33个寄存器。比如:数据包中"1234567823456789...",那么"1234567823456789",低位在前,高位在后,即表示寄存器值为0x8967452378563412,相当于数据包中用2字节表示1字节的实际数据。528字节的数据包中,从前往后依次,表示32个gpr与pc寄
NEMU DiffTest基本原理 DiffTest核心思想: 对于根据同一规范的两种实现, 给定相同的有定义的输入, 它们的行为应当一致。NEMU作DUT时,可以选择5种方式的模拟器,作为参考模拟器REF。当然,如果需要测试处理器硬件,那处理器也可以作为DUT。对于后面三种,楼主没有具体研究,因此本文也不作介绍。/,编译为动态库riscv64-qemu-so。/,编译为动态库riscv64-qemu-so。可以将NEMU/tools/可以将NEMU/tools/
搭建NEMU与QEMU的DiffTest环境(动态库方式) 这个函数在NEMU/tools/qemu-dl-diff/src/isa/x86/intr.c中定义(riscv怎么会用x86的代码?如果,我们正在开发一款处理器或者模拟器,那么我们的指令集实现,可能存在无数错误,此时我们需要找一个标准实现,也就是。在NEMU/tools/qemu-dl-diff/src/diff-test.c中,将。因此,qemu路径,必须为/usr/bin/qemu-system-riscv64。在NEMU/tools/qemu-dl-diff/build目录下,生成。
RISC-V指令集差分测试(DiffTest)系列教程 处理器运行一条指令,模拟器(如NEMU)也运行相同的指令,然后比较两者的状态。由于每运行一条指令,都会对比关键寄存器的数值,所以能够实现动态实时比对,从而更容易定位bug。:对于根据同一规范的两种实现, 给定相同的有定义的输入, 它们的行为应当一致。为了更好的学习研究NEMU中DiffTest功能,我们分如下章节进行介绍。4《搭建NEMU与QEMU的DiffTest环境(Socket方式)》3《搭建NEMU与QEMU的DiffTest环境(动态库方式)》5《NEMU中DiffTest移植》
负数在二进制中的表示方法 在二进制补码表示法中,负数是通过取其绝对值的二进制表示(即正数的二进制表示),然后取反(0变1,1变0),最后加1来得到的。在这种表示法中,符号位是最高位(Most Significant Bit, MSB)。
P4V代码冲突解决 《翻译P4V官方教程(5)Resolving Conflicts in P4V》:https://blog.csdn.net/u013412391/article/details/121667326
Windows和Linux的换行符CRLF/LF(\r\n,\n)简介 CR是Carriage-Return的缩写,即回车;LF是Line-Feed的缩写,即换行。CR和LF是在计算机终端还是电传打印机的时候遗留下来的东西。电传打字机就像普通打字机一样工作。在每一行的末端,CR命令让打印头回到左边。LF命令让纸前进一行。虽然使用卷纸的终端时代已经过去了,但是,CR和LF命令依然存在,许多应用程序和网络协议仍使用这些命令作为分隔符。Linux(unix) 和 mac 默认使用 "" 作为换行符;Windows 默认使用 "\r" 作为换行符;
在QEMU上运行OpenSBI+Linux+Rootfs 挂载到/mnt/ext2/目录后,当你在 /mnt/ext2/ 下写入文件或修改文件时,这些更改会反映到 rootfs.ext2 文件中。安装时,会将可执行程序qemu-system-riscv64,以及头文件等其他文件,拷贝至/opt/qemu目录下。到这里,我们已经对rootfs.ext2文件写入完毕,写入的内容,主要包括busybox、目录结构、rcS文件等。编译完后,在opensbi/build/platform/generic/firmware/目录下。
SPIKE源码编译与使用(二) 本文主要介绍,SPIKE模拟器运行Linux Kernel,也就是spike+bbl的情况。通常启动流程为:Bootloader+Kernel+File System。BBL,就相当于是Bootloader。Kernel和File System,既可以为2个独立的可执行文件,也可以集成为一个文件。本例这里,要求集成为一个文件。此外,Kernel和File System集成的单文件,最终还要被包含在BBL中,可以在riscv-pk编译时,进行指定。