FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

qemu-riscvはファイルの読み書きができない?

久しぶりにQEMUで遊んでいたのだけれども、RISC-V版のユーザモードQEMU(qemu-riscv64)で遊んでいると、どうもファイルの読み書きができないっぽい?

追記:これはlinux版gccでビルドするとうまくいくことが分かった。

riscv64-unknown-linux-gnu-gcc -static writeout.cpp -o writeout  # staticも追記する必要がある

  • writeout.cpp
#include <iostream>
#include <fstream>
#include <string>

int main ()
{
    std::cout << "Hello world\n";

    std::ofstream write_fp;
    std::string filename = "sample.txt";
    write_fp.open(filename, std::ios::out);
    std::string writing_text = "Hello World";
    write_fp << writing_text << std::endl;
    write_fp.close();
    return 0;
}
$ riscv64-unknown-elf-g++ writeout.cpp -o writeout
$ qemu-riscv64 -cpu rv64 writeout
Hello world
# ただしsample.txtが生成されない
  • writeout_c.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *write_fp;
    if ((write_fp = fopen("sample_c.txt", "w")) == NULL) {
        perror ("sample_c.txt");
    }

    fprintf(write_fp, "Hello QEMU!!\n");

    fclose(write_fp);

    return 0;
}
$ riscv64-unknown-elf-g++ writeout_c.c -o writeout_c
$ qemu-riscv64 -cpu rv64 writeout_c
sample_c.txt: 
# sample_c.txtは生成されない
#include <stdio.h>
#include <stdlib.h>
#define  MAX_LEN  100

int main()
{
    FILE *read_fp;
    char line[MAX_LEN], *result;

    if ((read_fp = fopen("sample_c.txt", "r")) == NULL) {
        perror ("sample_c.txt");
        exit(EXIT_FAILURE);
    }
    
    do {
        if ((result = fgets(line, MAX_LEN, read_fp)) != NULL) {
            printf("%s", line);
        }
    } while (!feof(read_fp));

    fclose (read_fp);

    return 0;
}
$ riscv64-unknown-elf-g++ read_c.c  -o read_c
$ qemu-riscv64 -cpu rv64 read_c
sample_c.txt: 
# なにもひょうじされない
$ spike pk read_c
bbl loader
Hello QEMU!!
# Spikeの場合はファイルの読み込みができた