MIPS R3000 - oraccha/omicron GitHub Wiki

MIPS

まずは基本の R3000 から.リリースは 1988 年あたり?

ロードストアアーキテクチャ

  • ロード: メモリ→レジスタ

  • ストア: レジスタ→メモリ

  • m68k のような豊富なアドレッシングモードは持っていない.

  • ワードアライメントされていない場合用の命令も用意されている.

パイプラインと遅延スロット

  • 遅延ロード
  • 遅延分岐

アドレス空間

  • 32bit の仮想アドレス空間を持つ.仮想アドレスは 20bit の VPN(Virtual Page Number) と 12bit のページ内オフセットからなる.また VPN の先頭 3bit はアドレスのマッピング方法を示す. {{{ 31 12 0 +-+-+-+---------------------+---------------+ | | | | VPN | offset | +-+-+-+---------------------+---------------+ 0 x x kuseg 1 0 0 kseg0 1 0 1 kseg1 1 1 x kseg2 }}}

  • アドレス空間のマッピングはユーザモードと特権モードで異なる.

    • ユーザモードからは kuseg の 2GB だけが見える.
  • キャッシュ,アドレス変換方式によって四つのセグメントに分割される.

    • kseg0/1 は物理アドレスの先頭 512MB にストレートマッピングされる.
    • kseg0 はキャッシュ可能,kseg1 はキャッシュ不可能.
    • kuseg/kseg2 アドレス空間の論物変換には TLB を利用する.キャッシュの設定は TLB エントリの N ビットにしたがう.

{{{ ffffffff +----------+ ffffffff +----------+ |kseg2 | | | | | | | c0000000 | | | | bfffffff +----------+ | | |kseg1 | | | | | | | a0000000 | | | | 9fffffff +----------+ | | |kseg0 | | | | | | | 80000000 | | | | 7fffffff +----------+ | | |kuseg | | | | | | | | | | | | | | | | | | | | | | | | | 20000000 | | | | 1fffffff +----------+ | | | | | | | | 00000000 | | 00000000 | | +----------+ +----------+

      仮想アドレス            物理アドレス

}}}


TLB

  • 64 エントリ.0〜7 は tlbwi 用に予約されており,tlbwr では書き込めない.
    • ../R4000 から? wired レジスタにより予約エントリを変更できる(R3000 コアでも TX39xx はサポート).
  • TLB EntryHI/LO レジスタ . TLB の読み書きに利用されるレジスタ.EntryHI + EntryLO で 1 エントリに相当する.
    • EntryHI {{{ 31 12 7 0 +---------------------------+-------+-------+ | VPN (Virtual Page Number) | PID | 0 | +---------------------------+-------+-------+

VPN: 仮想ページ番号 PID: Process ID (ASID とも呼ばれる.) }}} * EntryLO {{{ 31 12 7 0 +---------------------------+-+-+-+-+-------+ | PFN (Page Frame Number) |N|D|V|G| 0 | +---------------------------+-+-+-+-+-------+

PFN: ページフレーム番号 N: Non-cachable.キャッシュを参照せずに,メインメモリにアクセスする. D: Dirty.書込み保護ビット. V: Valid.0 の場合は TLB store/load ミス例外が発生する. G: Global }}}

TLB 操作命令

  • tlbp (TLB probe) . TLB エントリ内に TLB EntryHI レジスタと一致する内容のエントリが存在するか検査し,存在すれば,そのインデックスをインデックスレジスタに格納する.存在しなければ,インデックスレジスタの最上位ビットを 1 にする.
  • tlbwi (TLB write by index register) . インデックスレジスタで指定したエントリに TLB EntryHI/LO レジスタの値を設定する.
  • tlbwr (TLB write by random register) . ランダムレジスタが指すエントリに TLB EntryHI/LO レジスタの値を設定する.
  • tlbr (TLB read) . インデックスレジスタで指定したエントリを TLB EntryHI/LO レジスタにロードする.

仮想アドレス → 物理アドレスの変換 . x86 の MMU では,TLB 操作はソフトウェア側から隠蔽されているが,MIPS(を始めとした多くの RISC プロセッサ) では TLB ミス例外を OS がハンドリングして,TLB 操作を明示的に行なう必要がある.R3000 での手順は次の通り.

  • VPN を比較する.
    • マッチせず,MSB=1 ならば TLB ミス,でなければ UTLB ミス.
  • G=1 でないならば,PID も比較する.
    • マッチしなかった場合は,上と同様に TLB ミスか UTLB ミス.
  • V=0 ならば,TLB ミス.
  • D=0 かつ書込み(ストア)操作だった場合は,TLB 変更ミス.
  • N=1 ならキャッシュにアクセス,N=0 ならメインメモリにアクセス.
  • 得られた PFN にオフセットを加えて,物理アドレスを得る.

例外

  • 例外ベクタ
    • リセット例外: 0xbfc00000
    • UTLBミス例外: 0x80000000
    • その他の一般例外: 0x80000080
  • 例外レジスタ
    • 原因レジスタ
    • EPC (Exception Program Counter)
    • ステータスレジスタ
    • BadVaddr (Bad Virtual Address)
    • コンテキストレジスタ
    • PRId (Processor Revision Identifier)


命令形式 . 32bit 固定長で,次の3種類のフォーマットが存在する. {{{ I タイプ 31 26 25 0 +-------+------+------+---------------------+ | OP | RS | RT | IMMEDIATE | +-------+------+------+---------------------+

J タイプ 31 26 25 0 +-------+-----------------------------------+ | OP | TARGET | +-------+-----------------------------------+

R タイプ 31 26 25 21 20 16 15 11 10 6 5 0 +-------+------+------+------+------+-------+ | OP | RS | RT | RD |SHAMT | FUNCT | +-------+------+------+------+------+-------+

OP: 命令コード (6) RS: ソースレジスタ (5) RT: ターゲットレジスタ,または分岐条件 (5) IMMEDIATE: 即値,分岐ディスプレースメント,またはアドレスディスプレースメント (16) TARGET: 無条件分岐ターゲットアドレス (26) RD: ディスティネーションレジスタ (5) SHAMT: シフト量 (5) FUNCT: 機能フィールド (6) }}}