1

我编写了一个应用程序,它使用了几个三角函数(sin、tan、cos、...)。我的目标是研究这些函数在 GNU C 库、MUSL 和 Newlib 中的不同实现。

为此,glibcmusl刚刚使用 Buildroot 构建了一个 Linux GCC 工具链,然后我使用适当的编译器编译了我的应用程序,然后使用 QEMU(用户模式)运行它。这很简单。

现在我想将应用结果与 Newlib 版本进行比较。

在我的具体情况下,我正在为 RISC-VRV64GC架构和lp64dABI 进行编译。据我了解,使用 Newlib 库意味着使用编译器进行riscvv64-unknown-elf-gcc编译。传统上,Spike ISS 模拟器可用于使用proxy-kernel轻量级操作系统运行应用程序。有没有办法在 QEMU 中使用它?还是我应该构建一个完全裸机的应用程序?

4

1 回答 1

0

免责声明:我不是 RISC-V 专家。

我一直在尝试使用带半主机的 qemu-system-aarch64 4.1.0 无济于事,直到我发现有人想出了一个修复方法。由于 qemu 系统中对 RISC-V 的半主机支持目前可能无法与为 aarch64 提供的支持相提并论,因此我建议您构建一个 100% 裸机应用程序,同时依赖模拟串行端口进行最少的输入/输出操作。

例如,当使用 siive-u54 作为目标时,ns16550a地址处有一个 UART 可用0x10000000

dd if=/dev/zero of=dummy.bin bs=512 count=1
qemu-system-riscv64 -nographic -serial mon:stdio -machine virt,dumpdtb=qemu-virt-riscv64.dtb -cpu sifive-u54 -bios dummy.bin
dtc -I dtb -O dts qemu-virt-riscv64.dtb > qemu-virt-riscv64.dts
more qemu-virt-riscv64.dts

/dts-v1/;

/ {
        #address-cells = <0x02>;
        #size-cells = <0x02>;
        compatible = "riscv-virtio";
        model = "riscv-virtio,qemu";

        chosen {
                bootargs = [00];
                stdout-path = "/uart@10000000";
        };

        uart@10000000 {
                interrupts = <0x0a>;
                interrupt-parent = <0x03>;
                clock-frequency = <0x384000>;
                reg = <0x00 0x10000000 0x00 0x100>;
                compatible = "ns16550a";
        };
于 2019-11-13T19:43:45.703 回答