如何使用QEMU运行Newlib应用程序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用QEMU运行Newlib应用程序?相关的知识,希望对你有一定的参考价值。
我编写了一个使用几个三角函数(正弦,正切,余弦,...)的应用程序。我的目标是研究GNU C库,MUSL和Newlib中这些功能的不同实现。
为此glibc
和musl
,我只是使用Buildroot构建了Linux GCC工具链,然后使用适当的编译器编译了我的应用程序,然后使用QEMU(用户模式)运行了它。这很简单。
现在,我想将应用程序结果与Newlib版本进行比较。
在我的特定情况下,我正在为RISC-V RV64GC
体系结构和lp64d
ABI进行编译。据我了解,使用Newlib库意味着要使用riscvv64-unknown-elf-gcc
编译器进行编译。传统上,可以使用proxy-kernel
轻量级操作系统使用Spike ISS模拟器来运行应用程序。有没有办法在QEMU中使用它?还是应该只构建一个完全裸机的应用程序?
答案
免责声明:我不是RISC-V专家。
我一直在尝试将qemu-system-aarch64 4.1.0用作半主机无济于事,直到我发现有人发现了a fix。由于qemu系统中对RISC-V的半主机支持当前可能无法与为aarch64提供的半主机支持相提并论,因此,我建议您构建100%的裸机应用程序,同时依赖于模拟串行端口以最小化输入/输出操作。 >
例如,当使用sifive-u54作为目标时,在地址ns16550a
处有一个0x10000000
UART:
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";
};
以上是关于如何使用QEMU运行Newlib应用程序?的主要内容,如果未能解决你的问题,请参考以下文章