- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
dummy_rocc 是 RISCV 工具中一个简单的内置 RoCC 加速器示例,其中定义了多个 custom0 指令。设置 dummy_rocc 后(在 Spike ISA 模拟器或 Rocket-FPGA 上,不同),我们使用 dummy_rocc_test -- 一个用户程序测试用例来验证 dummy_rocc 加速器的正确性。我们有两种运行 dummy_rocc_test 的方法,可以在 pk(代理内核)或 Linux 上运行。
我曾经在 Spike ISA 模拟器上设置过 dummy_rocc,dummy_rocc_test 在 pk 或 Linux 上运行良好。
现在我在 Zedboard 上用 Rocket-FPGA 替换了 Spike。在 pk 上执行成功时:
root@zynq:~# ./fesvr-zynq pk /nfs/copy_to_rootfs/work/dummy_rocc_test
begin
after asm code
load x into accumulator 2 (funct=0)
read it back into z (funct=1) to verify it
accumulate 456 into it (funct=3)
verify it
do it all again, but initialize acc2 via memory this time (funct=2)
do it all again, but initialize acc2 via memory this time (funct=2)
do it all again, but initialize acc2 via memory this time (funct=2)
success!
在Linux上执行失败:
./fesvr-zynq +disk=/nfs/root.bin bbl /nfs/fpga-zynq/zedboard/fpga-images-zedboard/riscv/vmlinux
..................................Booting RISC-V Linux.........................................
/ # ./work/dummy_rocc_test
begin
after asm code
[ 0.400000] dummy_rocc_test[23]: unhandled signal 4 code 0x30001 at 0x0000000000800500 in ]
[ 0.400000] CPU: 0 PID: 23 Comm: dummy_rocc_test Not tainted 3.14.33-g043bb5d #1
[ 0.400000] task: ffffffff8fa3f500 ti: ffffffff8fb76000 task.ti: ffffffff8fb76000
[ 0.400000] sepc: 0000000000800500 ra : 00000000008004fc sp : 0000003fff943c70
[ 0.400000] gp : 0000000000882198 tp : 0000000000884700 t0 : 0000000000000000
[ 0.400000] t1 : 000000000080adc8 t2 : 8101010101010100 s0 : 0000003fff943ca0
[ 0.400000] s1 : 0000000000800d5c a0 : 000000000000000f a1 : 0000002000002000
[ 0.400000] a2 : 000000000000000f a3 : 000000000085cee8 a4 : 0000000000000001
[ 0.400000] a5 : 000000000000007b a6 : 0000000000000008 a7 : 0000000000000040
[ 0.400000] s2 : 0000000000000000 s3 : 00000000008a2668 s4 : 00000000008d8d98
[ 0.400000] s5 : 00000000008d7770 s6 : 0000000000000008 s7 : 00000000008d6000
[ 0.400000] s8 : 00000000008d8d60 s9 : 0000000000000000 s10: 00000000008a32b8
[ 0.400000] s11: ffffffffffffffff t3 : 000000000000000b t4 : 000000006ffffdff
[ 0.400000] t5 : 000000000000000a t6 : 000000006ffffeff
[ 0.400000] sstatus: 8000000000003008 sbadaddr: 0000000000800500 scause: 0000000000000002
Illegal instruction
截图显示“信号 4”是由 custom0 指令引起的。 readelf screenshot of dummy_rocc_test
所以我的问题是“Linux内核如何干扰Zedboard上RISC-V custom0指令的执行?”
dummy_rocc_test 源码提供引用:
// The following is a RISC-V program to test the functionality of the
// dummy RoCC accelerator.
// Compile with riscv64-unknown-elf-gcc dummy_rocc_test.c
// Run with spike --extension=dummy_rocc pk a.out
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
int main() {
printf("begin\n");
uint64_t x = 123, y = 456, z = 0;
// load x into accumulator 2 (funct=0)
// asm code
asm volatile ("addi a1, a1, 2");
/// printf again
printf("after asm code\n");
asm volatile ("custom0 x0, %0, 2, 0" : : "r"(x));
printf("load x into accumulator 2 (funct=0)\n");
// read it back into z (funct=1) to verify it
asm volatile ("custom0 %0, x0, 2, 1" : "=r"(z));
printf("read it back into z (funct=1) to verify it\n");
assert(z == x);
// accumulate 456 into it (funct=3)
asm volatile ("custom0 x0, %0, 2, 3" : : "r"(y));
printf("accumulate 456 into it (funct=3)\n");
// verify it
asm volatile ("custom0 %0, x0, 2, 1" : "=r"(z));
printf("verify it\n");
assert(z == x+y);
// do it all again, but initialize acc2 via memory this time (funct=2)
asm volatile ("custom0 x0, %0, 2, 2" : : "r"(&x));
printf("do it all again, but initialize acc2 via memory this time (funct=2)\n");
asm volatile ("custom0 x0, %0, 2, 3" : : "r"(y));
printf("do it all again, but initialize acc2 via memory this time (funct=2)\n");
asm volatile ("custom0 %0, x0, 2, 1" : "=r"(z));
printf("do it all again, but initialize acc2 via memory this time (funct=2)\n");
assert(z == x+y);
printf("success!\n");
}
最佳答案
“非法指令”是指您的处理器抛出非法指令异常。
由于 custom0 不会成为 Linux 知道如何在软件中执行的东西(因为它是可定制的东西!),Linux 会 panic 并抛出您看到的错误。
我要问你的问题是“你是否在处理器中实现了 custom0 指令?是否启用了它?当你使用代理内核时,程序是否正确执行了你的 custom0 指令并返回了正确的答案?”
关于linux - Linux 内核如何干扰 Zedboard 上 RISC-V custom0 指令的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32980262/
什么是RISC-V?它为什么被创建?与之前的 RISC 架构相比,它有哪些改进? (这是 StackOverflow 上 RISC-V 的 wiki。) 最佳答案 RISC-V 是一种指令集架构 (I
我有一些代码主要用 C 语言编写,可以在 HP-UX PA-RISC、HP-UX Itanium 和 Solaris SPARC 平台上编译。 到目前为止,我的 PA-RISC 机器已停产,这是不真实
我即将使用 CLINT 编写我自己的 RV32I 内核。但是,有些事情对我来说并不完全清楚。至少我在文档中找不到它。以下是特权 isa 规范对 ecall/ebreak 的说明: ECALL and
在浏览 RISC-V ISA 时,我在内存模型部分看到了一条指令(FENCE 指令)。究竟是什么意思? 最佳答案 RISC-V ISA 使用宽松的内存模型,其中一个线程执行的加载和存储顺序在另一个线程
RISC-V 当前软件权限级别未在任何 CSR 中设置。尽管如此,规范指出“尝试在没有适当权限级别的情况下访问 CSR ......引发非法指令”。那么如何实现(在硬件中)? 最佳答案 好吧,在中断上
我最近正在研究 RISC-V 32I 指令。我有一个关于 NOP 指令的问题,规范称它等于 ADDI x0, x0, 0。 但是,x0不是一个可以由程序员修改的通用寄存器。那么,为什么x0在这里充当N
我正在寻找在游戏中构建一个虚拟机,并且想知道是否有人知道任何非常简单的虚拟机(我认为 RISC/PIC 接近我想要的),通常用于嵌入式项目,例如控制机器人、电机、传感器等。我主要关心的是如果我自己编写
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
如果您正在写一本教科书,并且需要决定 CPU 设计来讨论某些问题,您会选择 RISC 还是 CISC? RISC 的优点,你知道的:更干净、更简单等等。 RISC 的缺点:我必须使用模拟器,与 x86
我没有在ISA 2.0中看到任何有关IO的信息。 RISC-V IO存储器是否已映射?是否有关于如何完成IO的规范? 我可以定义自己的方法吗? TIA。 最佳答案 是的,它是内存映射的。确切的规格仍在
你好,我正在写一个小内核来更好地理解 RISC-V。到目前为止,我设法使用 UART 并设置了一个简单的内存管理器。为了能够解析用户输入,我设置了一个中断处理程序并将其地址设置为 MTVEC。然后我在
我在哪里可以找到支持 "V" Vector Extension 的 RISC-V 模拟器? 我知道当前规范版本 0.8 是草案: This is a draft of a stable proposa
我目前正在通过 RISC-V 学习基本的汇编语言,我对遍历数组的有效方法有点困惑。 如果我们将 a0 作为指向整数数组的指针,是否足以移动到下一个元素? lw s0, 0(a0) #指向数组的指针存储
我正在寻找支持 RISC-V 向量扩展 v1.0 的 C/C++ 工具链,如官方定义 spec . Spike似乎支持 vector rvv1.0,但我找不到与之一起使用的工具链。 都不是GCC (我
故意在 RISC-V 中引发非法指令的最简单、最易读和最直接的方法是什么? 我知道根据规范,任何“全零”指令(因此 32/16 位仅零)都是“定义的非法指令”(第 12.5 节,用户规范)。但是我不知
这是《汇编语言简介》一书中关于RISC(与CISC)的引述 In MIPS, we could write procedures without using the stack. For most n
我目前正在研究具有规范版本 2.2 和特权架构版本 1.10 的 RISC-V 规范。在 RISC-V 规范的第 2 章中,提到“[...] 尽管一个简单的实现可能涵盖了八个 SCALL/SBREAK
RISC-V 汇编器中的大多数指令在源操作数之前对目标操作数进行排序,例如: li t0, 22 # destination, source li t1, 1 # d
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我正在 QEMU 中运行一个模拟的 RV64GC 内核,并试图更好地理解 RISC-V 中的虚拟内存子系统和地址转换过程。我的模拟系统使用 OpenSBI、Linux Kernal v5.5 和最小的
我是一名优秀的程序员,十分优秀!