MIPS R3000 - oraccha/omicron GitHub Wiki
まずは基本の 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 | | +----------+ +----------+
仮想アドレス 物理アドレス
}}}
- 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) }}}