Program Memoryの書き換え
そもそもどのタイミングでプログラムがロードされるのか(xv6カーネルから)
そして、Data MemoryとProgram Memoryをどうやって区別しているのか(See Mips Run)
See MIPS Run - Dominic Sweetman - Google ブックス
D-Cacheにまずプログラムが読み込まれて、そいつをI-Cacheに同期するみたいな感じ? synci
という命令があるらしい。
下はGAIAのI-Cache実装時のlog add instruction cache · nyuichi/GAIA3@bea8cb9 · GitHub
GAIAはModified Harvard Architectureっぽいぞ
GAIA3/top.vhd at 67bbdfb4c949258f91d3f3750064ac1fc40295ac · nyuichi/GAIA3 · GitHub
このへん。RAMというのが主記憶っぽい。i-cache, d-cacheは単純にRAMのサブセットとしてのキャッシュ(FPGAのBlockRAMというのを使ってる。ちょっと調べた感じSRAMと同じくらい早い?)。SRAMもFPGAのハードウェアPINを使っていて、RAMのキャッシュとして機能している。(RAMに組み込まれている感じ)
さらに、メモリ(RAM)では、「req(uest) - gr(a)nt」ステートを使用している。これはInstructionとDataを1つの物理メモリで扱うために必要なもの。例えばi-cacheがミスしてRAMに問い合わせている(BrockRAMにFETCHした結果を書き込んでいる)最中に、d-cacheが同様にページフォールトした場合、後者は前者のFETCHが終了するまで待たされなければならない。それを実現する仕組み。(でもこれって単純にwireを両者分用意しておけば、こんな面倒なことせずにいけるんでは...)
そもそも1つの物理メモリのみを使用しているのは、kernel(OS)を動かす場合、そのほうがハードウェア側がシンプルになるから?補助記憶装置(kernelとかユーザプログラムが置いてある場所)から主記憶にプログラム展開する際に、MIPSでは「Program Memoryにloadするのか、Data Memoryにloadするのか」区別するような命令がないためか。
ROM (GAIA)
これが結構重要で、実機で動かす場合のbootloaderをどこに実装しているのかと思ったら、ここにあった。逆アセンブルしないと何やってるのかわからないが、 bootloader_prog_silent
ってのが一番最近に実装されてる。しかし、実際に使われてるのは bootloader_prog
ってやつ。