Program Memoryの書き換え

そもそもどのタイミングでプログラムがロードされるのか(xv6カーネルから)

そして、Data MemoryとProgram Memoryをどうやって区別しているのか(See Mips Run)

f:id:varmil:20171105231749p:plain

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と同じくらい早い?)。SRAMFPGAのハードウェア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 ってやつ。

GAIA3/data.vhd at master · nyuichi/GAIA3 · GitHub