ひまわり

はやく人間になりたい

RISC-V systemからメモリマップがほしい

はじめに

lowRISC(RISC-Vの実装のRocket coreを含むシステム)のboot時のメモリマップの取得方法がわからなかったので調べた。

RISC-V Linux

riscv-linuxで検索してみると github.com sbi_query_memory と言う関数を呼び出しているらしく 更にその定義は,

arch/riscv/include/asm/sbi.h

...
unsigned long sbi_query_memory(unsigned long id, memory_block_info *p);
...

arch/riscv/kernel/sbi.S

.global sbi_query_memory; sbi_query_memory = -2016;
...

らしい

SBI

sbiとは一体なんなのか、それはriscv-privileged-v1.9のChapter 9に Supervisor Binary Interface (SBI)とある。 これは、仮想メモリ空間の上位2KiBに配置され、x0をbase registerとしてjalr命令で呼び出されるらしい。 (x0はzero registerだから常にリニアアドレス?) というか、RISC-Vとして定義されていることに驚いた。

sbi_query_memory

しかし、ここにはPreliminary list しか乗っておらず、sbi_query_memoryは見当たらない。

どうにかmemory mapの提供については、riscv sw dev メーリスでいくつか見ることができた。

特に二つ目で、議論されていたがまだ読み切れていないので、何かわかったら追記していきたい。
とりあえず今は、あるべきか、否かがまだ確定していないので、仕様として乗っていないのであろう。

少なくとも、Spike*1の現状の実装は、sbi_query_memoryは存在して、riscv-linux*2と、FreeBSD/RISC-V port*3はこれを使っている。

まとめ

現状仕様としては確率していないが、riscv linuxを含むいくつかの実装がこれに依存しているので環境によっては使える。 個人で何か作って、spikeやlowRISCで動かす分にはこれを使って、今後変更が有った際は、riscv linuxの実装読みに行くか、 Privileged ISA Specificationを読めばいいだろう。

まったく関係ない話

[llvm-dev] [RFC] RISC-V backend これもどうなったか調べたい

参照

おわり