- 博客(360)
- 资源 (30)
- 收藏
- 关注
原创 编译玄铁处理器RISC-V指令测试用例
解压Xuantie-900-gcc-elf-newlib-x86_64-V2.0.3-20210806.tar.gz后,编译器位于Xuantie-900-gcc-elf-newlib-x86_64-V2.0.3\bin\riscv64-unknown-elf-gcc路径。执行此命令,就会使用riscv64-unknown-elf-gcc来编译RISC-V测试用例源码,若没有报错,则表示编译成功。由于配置文件和make时,默认使用csh,而不是bash,因此需要安装这个csh。编译ISA_THEAD用例。
2025-04-01 21:57:32
1069
原创 riscv架构下linux6.12.7实现early打印
在linux 6.12.7源码中,early console注册的函数调用栈:```cppstart_kernel =>setup_arch =>parse_early_param =>parse_early_options =>do_early_param =>param_setup_earlycon =>setup_earlycon =>register_earlycon =>register_console```
2025-01-14 17:25:35
301
原创 riscv架构下linux4.15实现early打印
适配内核到新的平台,基本环境搭建好之后,首要的就是要调通串口,方便后面的信息打印。正常流程 init/main.c 中 start_kernel 入口,要到 console_init 之后才能真正打印,前面的打印,都是缓存在 printk 的 ringbuffer 中的。
2025-01-14 17:17:06
974
原创 X86(Local APIC+I/O APIC)与RISC-V(IMSIC+APLIC)对比
将X86(Local APIC+I/O APIC)与RISC-V(IMSIC+APLIC)进行对比。
2025-01-06 20:38:30
585
原创 AIA - APLIC之三(附APLIC处理流程图)
在MSI投递模式(domaincfg.DM = 1)下,中断域通过MSI将中断转发到目标hart。仅当中断源对应的pending位和enable位都为1,并且寄存器domaincfg的IE字段也为1时,才会为特定中断源发送MSI。如果发送MSI,则源的中断pending位将被清除。4.1 MSI的地址和数据MSI的数据,取自target[i]的EIID字段,0扩展到32位。无论域的domaincfg寄存器BE字段如何,MSI的32位数据,始终以小端字节顺序写入。要通过MSI转发中断,APLI
2025-01-05 21:27:42
1641
原创 AIA - APLIC之一
在RISC-V系统中,PLIC 处理外部中断是通过线中断,而非MSI(message signal interrupt) 的方式。(APLIC),不向下兼容,也就是说,不与RISCV PLIC兼容。完整的AIA架构,是需要APLIC这个组件的。只要向 hart 发送 interrupt 是使用 wire interrupt 而不是 MSI,就可以使用 PLIC 建立一个可行的系统。不过,假设系统中不需要支持MSI,使用原有的PLIC也是可行的。在的系统中,
2024-12-31 15:13:12
793
原创 AIA - APLIC之二
该控制区域大小是由4KB的倍数,并与4KB地址边界对齐,最小的有效控制区域是16KB。接下来,本文将详细讲解,APLIC中断域的内存映射空间。
2024-12-31 15:09:02
1173
原创 AIA - IMSIC之二(附IMSIC处理流程图)
软件通过描述的CSR来访问IMSIC。machine level 相关的CSR有以下:miselect、mireg、mtopei。supervisor level 相关的 CSR 有以下:siselect、sireg、stopei。当 hypervisor extension 实现时,与 VS CSR 相关的有以下:vsiselect、vsireg、vstopei。miselect 和 mireg通过间接的方式,访问machine level的附带寄存器。
2024-12-25 17:23:14
1148
原创 AIA - IMSIC之一
Incoming MSI Controller(IMSIC)是一个可选的RISC-V硬件组件,它与hart紧密耦合:- 每个hart有一个IMSIC。- 每个IMSIC包含M/S/VS-level的interrupt file,对应hart内的不同特权等级的csr pending寄存器:mip、sip、vsip。- IMSIC会接收target为该hart的MSI中断,一旦该MSI中断的pending和enable bit置位时,就会将其发送到该hart的对应特权等级中。- IMSIC中包含一到多个
2024-12-20 17:46:20
933
原创 AIA - 新增的CSR
AIA框架,新增的M模式CSR寄存器,如下:mtopei,仅在实现IMSIC时才存在,用于记录当前最高优先级的外部中断号(即外部中断的minor identity),由IMSIC负责维护。mtopi,用于记录当前最高优先级的pending和enable位都置位的中断号。
2024-12-19 20:54:10
796
原创 AIA - 介绍
Advanced Interrupt Architecture for RISC-V(AIA),RISC-V的高级中断架构。该AIA规范相对于原有的PLIC规范,增加了MSI消息中断的支持,可以更好的应用于多核NoC的网络中。APLICIMSICRISC-V 特权架构为每个 hart 上的 interrupt cause 定义了不同的 ID number ,这是当 trap 发生时自动写入 mcause 或是 scause 的。
2024-12-19 17:17:36
1117
原创 开源浮点运算库SoftFloat
SoftFloat是一个开源的、跨平台的、高效实现IEEE 754单精度和双精度浮点数运算的C代码库。该项目由John L. Hennessy教授领导的斯坦福大学计算机系统实验室开发。它提供了完整的API接口,可以方便地集成到各种应用中。目前最新版是,2018.1月发布的softfloat 3e。1rfz。
2024-09-18 17:55:19
520
1
原创 QEMU中GDB远程串行协议
GDB(GNU Debugger)是一个强大的代码调试工具,它提供了一种使用串行通信协议进行远程调试的方法。在GDB中,可以通过GDB服务器和GDB客户端进行远程调试。其中,GDB远程串行协议允许GDB客户端通过串行连接(如USB或TCP/IP)与GDB服务器通信。GDB远程串行协议的主要作用是:允许开发者在一个系统(通常是开发主机)上,调试另一个系统(通常是目标设备)上运行的程序。这在调试嵌入式系统或需要物理访问硬件的情况下特别有用。
2024-08-23 14:39:58
1203
原创 RISC-V特权架构 - 时钟中断处理
经过对MTI和STI中断的处理分析,发现两者的查询处理逻辑,其实是一样的。其处理流程,总结为以下几个步骤(以XXI:检查确保XXI中断使能,且该中断被触发根据运行模式,检查全局中断开关检查mstatus.mie:禁用M全局中断,不处理:使能M全局中断,继续检查委托:不委托,陷入M:委托到S,陷入S检查mstatus.sie:禁用S全局中断,继续检查委托:不委托,陷入M:委托到S,不处理:使能S全局中断,继续检查委托:不委托,陷入M:委托到S,陷入S。
2024-08-12 21:31:40
1714
原创 解决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原有寄存器。
2024-07-24 20:57:37
819
原创 解决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才能运行。
2024-07-23 20:15:31
603
原创 NEMU与QEMU的DiffTest联调经验
当我们搭建NEMU与QEMU的DiffTest环境时,修改了很多代码,免不了需要两边一起调试,解决一些问题。这里,对这些调试经验做下小结。
2024-07-13 21:25:00
1085
原创 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。运行,即可在该断点处停住。
2024-07-13 14:44:04
1353
原创 RISC-V在线反汇编工具
RISC-V在线反汇编工具:https://luplab.gitlab.io/rvcodecjs/#q=34179073&abi=false&isa=AUTO似乎,只支持RV32I、RV64I、RV128I指令集:
2024-07-13 13:20:25
1532
原创 搭建NEMU与QEMU的DiffTest环境(Socket方式)
NEMU可以调用gdb_getregs函数,从QEMU获取到寄存器数据,一共528字节,每个字节为"0" ~ "9"或"a" ~ "f"之间的任一字符,每16个字节表示一个寄存器值,共表示33个寄存器。比如:数据包中"1234567823456789...",那么"1234567823456789",低位在前,高位在后,即表示寄存器值为0x8967452378563412,相当于数据包中用2字节表示1字节的实际数据。528字节的数据包中,从前往后依次,表示32个gpr与pc寄
2024-07-12 22:49:18
1565
原创 NEMU DiffTest基本原理
DiffTest核心思想: 对于根据同一规范的两种实现, 给定相同的有定义的输入, 它们的行为应当一致。NEMU作DUT时,可以选择5种方式的模拟器,作为参考模拟器REF。当然,如果需要测试处理器硬件,那处理器也可以作为DUT。对于后面三种,楼主没有具体研究,因此本文也不作介绍。/,编译为动态库riscv64-qemu-so。/,编译为动态库riscv64-qemu-so。可以将NEMU/tools/可以将NEMU/tools/
2024-07-12 13:03:39
1472
原创 搭建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目录下,生成。
2024-07-07 21:10:22
1200
原创 RISC-V指令集差分测试(DiffTest)系列教程
处理器运行一条指令,模拟器(如NEMU)也运行相同的指令,然后比较两者的状态。由于每运行一条指令,都会对比关键寄存器的数值,所以能够实现动态实时比对,从而更容易定位bug。:对于根据同一规范的两种实现, 给定相同的有定义的输入, 它们的行为应当一致。为了更好的学习研究NEMU中DiffTest功能,我们分如下章节进行介绍。4《搭建NEMU与QEMU的DiffTest环境(Socket方式)》3《搭建NEMU与QEMU的DiffTest环境(动态库方式)》5《NEMU中DiffTest移植》
2024-07-07 17:52:56
642
原创 负数在二进制中的表示方法
在二进制补码表示法中,负数是通过取其绝对值的二进制表示(即正数的二进制表示),然后取反(0变1,1变0),最后加1来得到的。在这种表示法中,符号位是最高位(Most Significant Bit, MSB)。
2024-06-20 17:58:46
2153
转载 P4V代码冲突解决
《翻译P4V官方教程(5)Resolving Conflicts in P4V》:https://blog.youkuaiyun.com/u013412391/article/details/121667326
2024-06-19 11:47:06
317
转载 Windows和Linux的换行符CRLF/LF(\r\n,\n)简介
CR是Carriage-Return的缩写,即回车;LF是Line-Feed的缩写,即换行。CR和LF是在计算机终端还是电传打印机的时候遗留下来的东西。电传打字机就像普通打字机一样工作。在每一行的末端,CR命令让打印头回到左边。LF命令让纸前进一行。虽然使用卷纸的终端时代已经过去了,但是,CR和LF命令依然存在,许多应用程序和网络协议仍使用这些命令作为分隔符。Linux(unix) 和 mac 默认使用 "\n" 作为换行符;Windows 默认使用 "\r\n" 作为换行符;
2024-05-23 11:48:44
1985
2
原创 在QEMU上运行OpenSBI+Linux+Rootfs
挂载到/mnt/ext2/目录后,当你在 /mnt/ext2/ 下写入文件或修改文件时,这些更改会反映到 rootfs.ext2 文件中。安装时,会将可执行程序qemu-system-riscv64,以及头文件等其他文件,拷贝至/opt/qemu目录下。到这里,我们已经对rootfs.ext2文件写入完毕,写入的内容,主要包括busybox、目录结构、rcS文件等。编译完后,在opensbi/build/platform/generic/firmware/目录下。
2024-05-07 19:53:12
2354
2
原创 SPIKE源码编译与使用(二)
本文主要介绍,SPIKE模拟器运行Linux Kernel,也就是spike+bbl的情况。通常启动流程为:Bootloader+Kernel+File System。BBL,就相当于是Bootloader。Kernel和File System,既可以为2个独立的可执行文件,也可以集成为一个文件。本例这里,要求集成为一个文件。此外,Kernel和File System集成的单文件,最终还要被包含在BBL中,可以在riscv-pk编译时,进行指定。
2024-05-06 11:23:31
1378
1
原创 SPIKE源码编译与使用(一)
一个专门为RISC-V设计的指令集模拟器,由RISC-V基金会开发,其主要聚焦于RISC-V ISA的完整性测试,是golden model simulator,可用来检查RISCV的规范一致性。它实现了一个较为简洁的模拟环境,通常用来运行和调试RISC-V汇编程序或C程序。相比qemu,spike的实现相对简单,它的主要目的是提供一个轻量级的RISC-V核心模拟,通常不包括周边设备的模拟。在进行系统集成时,可能需要额外的工具来模拟外围设备。
2024-04-29 20:02:17
2368
原创 NEMU模拟器源码编译与使用
NEMU(NJU Emulator)最早是由南京大学实现的一个用于教学的计算机指令集体系结构(ISA)模拟器,香山处理器团队基于2019版的NEMU进行增强和维护,用于香山处理器前期RISC-V指令集和体系结构的模拟。因此,NEMU也称为香山模拟器,NEMU支持x86、mips32、RV32和RV64等指令集体系结构。
2024-04-26 22:20:58
4371
1
原创 使用riscv-tests进行指令测试(二)
从入口开始执行,再跳转到位置;在位置,开始做一些初始化操作,主要包括x系列寄存器、mtvec、stvec、satp、medeleg、mideleg、mstatus、mepc等寄存器;其中,mepc寄存器初始化最关键,这里将地址0x80000190,保存到mepc寄存器中,以确保mret指令执行模式返回时,PC可直接跳转到0x80000190处,即处,我们的第一个测试点;
2024-04-25 15:46:41
1752
原创 使用riscv-tests进行指令测试(一)
riscv-tests,是用于验证RISC-V处理器实现,是否符合其指令集架构规范的一组测试程序。具体来说,riscv-tests目录包含isa、debug、mt和benchmarks的测试文件、底层相关驱动以及编译的文件,用于测试RISC-V CPU的实现。其中,benchmark测试,包含一些业内公认的C代码测试集;而ISA测试,则包含定向指令测试,如机器/用户/监督者模式下I/A/C/D/F/M类型的指令测试。
2024-04-25 11:23:55
3501
1
原创 TinyEMU之文件系统构建
BusyBox作为一个集成了众多常用命令和工具的软件,用户可以直接通过命令行调用这些工具,无需单独安装每个工具。这使得BusyBox在嵌入式系统、小型Linux系统或资源受限的环境中特别有用,因为它可以显著减少系统所需的存储空间,同时提供基本的命令行操作和管理能力。此外,BusyBox的集成性也提高了系统的可维护性和易用性。由于BusyBox包含了大量的常用命令,用户无需担心系统中缺少某些必要的工具,可以更加方便地进行系统配置、文件操作、网络管理等任务。
2024-04-22 21:37:38
720
原创 TinyEMU源码分析之访存处理
访存指令,主要有,如下这些:在RISC-V架构中,CPU在处理与内存访问相关的这些指令时,会发出对某地址的访问。这些指令通常涉及加载(Load)和存储(Store)操作,用于从内存中读取数据或将数据写入内存。本文旨在,通过分析访存指令的执行,以理解CPU在执行指令时,是如何发出以及处理这些地址请求的。
2024-04-17 19:52:45
1102
原创 TinyEMU源码分析之中断处理
mtimer是实现在M模式下的定时器,它位于CLINT控制器内部。并给该计时器,定义了两个64 位宽的寄存器mtime和mtimecmp。当mtime 中的计数值 >= mtimecmp 中设置的比较值时,计时器便会产生时钟中断。时钟中断,会一直拉高,直到软件重新写mtimecmp 寄存器的值,使得mtimecmp值大于mtime值,从而将计时器中断清除。在TinyEMU源码,riscv_machine.c中riscv_machine_get_sleep_duration函数,如下:当mtimecmp
2024-04-12 19:01:18
1528
原创 RISC-V特权架构 - 中断注入
对于该中断的处理过程,与正常中断处理流程一致,可参考《RISC-V特权架构 - 模式切换与委托》中《中断处理时模式切换》章节。设置mip寄存器中的STIP字段,相当于把M模式下的定时器中断,注入S模式,并由S模式的操作系统处理。因此,我们看起来,像是固件异常处理代码,伪造了一个S模式下时钟中断,这个过程,就叫做中断注入。相对而言是硬件中断,硬件中断,一般是靠GPIO引脚的高低电平来触发。注入中断后,在mip寄存器中,对应bit指示了,发生了何种中断。
2024-04-10 11:49:13
746
原创 RISC-V特权架构 - 模式切换与委托
若medeleg中该异常对应bit为1,表示该异常,需要委托给S模式处理,则更新scause、sepc、stval、mstatus、pc这些S模式寄存器,并切换到S模式;若bit为0,表示不委托,则更新mcause、mepc、mtval、mstatus、pc这些M模式寄存器,并切换到M模式,异常服务程序执行完毕后,通过mret指令返回到之前的模式。因此,系统调用,这种异常的处理,与《2.1 异常处理的模式切换》完全一致,不再赘述。更新寄存器,进入模式,以及返回指令,与异常处理时,完全一致,不再赘述。
2024-04-08 17:58:16
1984
NEMU模拟器源码(DiffTest)
2024-07-15
DOSBox-MASM.rar
2023-10-12
AMD处理器编程指导手册
2023-02-18
CodeEditor源码文件
2022-12-07
CXL2.0协议规范文档-中文版
2022-10-27
CXL1.1协议规范文档-中文版
2022-10-27
SourceInsight4.0仿VS2013代码风格主题
2022-02-16
2020最新个税计算器打包脚本
2020-10-19
2020最新个税计算器免安装版
2020-10-19
2020最新个税计算器安装包
2020-10-19
cachesize-master.zip
2020-09-23
processhacker-2.39-sdk.zip
2020-09-23
Flops-master.zip
2020-09-13
processhacker-2.39-src.rar
2020-09-13
processhacker-2.39-bin.rar
2020-09-13
AMD_block_prefetch_paper.pdf
2020-09-13
qt-vsaddin-msvc2017-2.4.3-rev.07.vsix
2020-09-13
boost_reflect-master.rar
2020-09-13
Win64OpenSSL-1_0_2u.rar
2020-09-13
rttr-0.9.5-win64-vs2015.7z
2020-09-13
ResourceHacker.rar
2020-09-13
FastMemcpy-master.zip
2020-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人