どうも、たくチャレ(@takuchalle)です。

RustでRISC-V OS自作!はじめの一歩を参考に、QEMUHello Worldをしようとしたところ以下のようなエラーが出ました。

rom: requested regions overlap (rom phdr #0: target/riscv32imac-unknown-none-elf/release/blog_os_rs. free=0x000000008000f2c0, addr=0x0000000080000000)

blog_os_rsは、Writing an OS in RustRISC-V向けのポーティングしてるプロジェクトです。

動作環境

  • QEMU Version: 5.2.0
  • Rust Target: riscv32imac-unknown-none-elf

対処法

結論から言うと、QEMU実行時に--bios noneオプションをつけることで解決します。

メモリの範囲が被ってる的なエラーだったので、リンカスクリプトやメモリマップをめちゃめちゃ確認したのですが、結局QEMUのオプションで解決するという。 具体的にこのオプションが何をやってるかまでは調べられてないが、おそらく BIOS がすでにロードされててメモリが被ってるのでしょう。

こちらの記事ではQEMUのバージョンが3.0.0なので、QEMUのデフォルトの挙動が変わったと思われます。