See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
R3000 - Wikipedia

R3000

出典: フリー百科事典『ウィキペディア(Wikipedia)』

IDT79R3051 R3000Aコア,命令キャッシュ4KB,TLB無し
IDT79R3051 R3000Aコア,命令キャッシュ4KB,TLB無し

R3000は、1988年にリリースされた32ビットMIPSアーキテクチャRISCマイクロプロセッサである。

R3000 はCPUと、メモリ管理および例外処理を担当するCP0と呼ばれる部分から構成される。またFPUR3010という別チップであり、R3000と密に結合して使用される。基本的に従来のR2000と同じアーキテクチャで、動作周波数と内蔵キャッシュメモリ容量が強化されている。動作周波数は様々(20MHz~40MHz)だが、主に30MHz、33MHzで使用されることが多い。一次キャッシュは命令用64Kバイト、データ用64Kバイトであり、二次キャッシュは外付け可能ではあるがCPUから制御する手段はアーキテクチャ上は用意されていない。

ミップス社は設計のみを行い、製造はメーカーに任せていた。R3000 を製造したメーカーとしては、IDTLSIロジックNECシーメンス東芝などがある。SGIなどのワークステーションやサーバに使用された。また、PlayStationのプロセッサとしても使用され、組み込みシステムにも多く使われた。

目次

[編集] アーキテクチャ

R3000のパイプライン構造
R3000のパイプライン構造

R3000 は、4つのコプロセッサをサポート可能なアーキテクチャとなっているが、実際に使っているのはふたつであり、CP0 としてメモリ管理ユニットと例外処理ユニットを内蔵し、CP1 として接続された FPU を制御する。後継アーキテクチャでは FPU の拡張命令を CP1X として従来 CP3用とされていたオペコード表に割り当てている。命令はすべて32ビットとなっていて命令フェッチとデコードを単純化している。CPUのパイプラインは5段になっていて、実行ユニットとしてALU以外に、乗除算ユニットなどを持っている。CPUの汎用レジスタは32ビット×32本で、他に乗除算の結果を格納する専用レジスタ(32ビット×2本)とプログラムカウンタがある。

R3000での基本的な仮想空間と物理空間の対応
R3000での基本的な仮想空間と物理空間の対応

CP0 は、以下のような機能を持つ。

  • ユーザモード、カーネルモードの設定
  • 例外発生時の原因情報を保持
  • メモリ管理機能。MIPSアーキテクチャでは仮想物理アドレス変換のためのTLBを直接ソフトウェアで制御するようになっており、そのための機能を実装している。TLBは64エントリのCAM(連想メモリ)であり、各エントリが4Kバイトのページをマップする。そのうち 8エントリは固定エントリと呼ばれ、オペレーティングシステムが固定的に使用し、それ以外はランダムエントリとして無作為に入れ替えて使用する。OSのカーネルはTLBを操作する際に、TLBを使用しない空間(下記)で動作するか、固定TLBエントリのマップする空間内で動作しなければならない。
    • TLB を使用しないメモリアクセスも可能になっていて、右図のようになっている。kseg1メモリマップドI/Oに使用するため、I/Oをその位置に配置すると、TLBを使わずにアクセスできるメモリは512Mバイト以下となる。
    • TLBミスヒットが発生した場合、カーネルが処理を行う。これは他のアーキテクチャではハードウェアで実現している機能であり、ここを如何に最適化するかが性能に重要な影響を与える。OSが用意したページテーブルを仮想空間上で連続に配置しておくと高速にTLBのリフィル(置き換え)ができるよう設計されているが、そのためにはページテーブルがTLB上でマップされている必要があり、固定TLBエントリがこの用途のために使われることが多い。
  • キャッシュメモリはTLBの外側にあり、物理アドレスタグになっている。ダイレクトマップ方式であるため、物理アドレスがちょうど64Kバイトの倍数分だけ離れたところにある配列のコピーなどを行うとキャッシュのスラッシングと言われる現象が発生して劇的に性能が低下する。つまり、ロード命令によってキャッシュ上に置かれたメモリ内容を直後のストア命令で置き換えてしまうため、次のロード命令でも再度メモリから読み込む必要が生じるのである。

FPU(R3010)は、以下のような特徴を持つ。

  • IEEE 754 浮動小数点数の規格に準拠したフォーマット。
  • 32ビット×32本のレジスタ。倍精度演算では 64ビット×16本のレジスタとして使用。
  • 6段のパイプライン。実行ユニットは、加減算ユニット、乗算ユニット、除算ユニットの3つ。
  • CPUとは異なり、ステータス・レジスタを持っている。

[編集] 命令セットの概要

命令は三種類のフォーマットに分類される(R, I, J)。Rフォーマットは三つのレジスタとオペコードから構成される。Iフォーマットは二つのレジスタと16ビットのイミディエート値(とオペコード)から構成される。Jフォーマットは6ビットのオペコードと26ビットのイミディエート値から構成される。

算術演算(加減算)は以下のような形式である。

add  $1,  $2,  $3 ; $1 = $2 + $3 (符号付)
addu $1,  $2,  $3 ; $1 = $2 + $3 (符号無)
sub  $1,  $2,  $3 ; $1 = $2 - $3 (符号付)
subu $1,  $2,  $3 ; $1 = $2 - $3 (符号無)
addi $1,  $2, 100 ; $1 = $2 + 100 (符号拡張されたイミディエート値)

符号無イミディエート値の加算(addiu)もある。またイミディエート値の減算はaddiで負の値を指定することで実現できる。

MIPSは、ロード・ストア型のアーキテクチャなので、メモリへのアクセスは基本的に以下のふたつの命令で実現される。

lw  $1, 100($2) ; $2 + 100 で示されるアドレスのメモリワード(32ビット)を $1 レジスタにロードする。
sw  $1, 100($2) ; $1 レジスタの内容(32ビット)を $2 + 100 で示されるアドレスのメモリにストアする。

分岐とジャンプ命令には、以下のようなものがある。これらは必ず次の命令を実行してからジャンプするため(ディレイスロット)、注意が必要である。

beq $1,  $2, 100 ; もし ($1 == $2) ならば、PC+4+100 へ飛ぶ。
slt $1,  $2,  $3 ; もし ($2 < $3) ならば $1 = 1、そうでなければ $1 = 0 。(これは正確には比較命令)
j       10000    ; 10000番地へ飛ぶ。
jal     10000    ; $31 = PC + 4 とした上で、10000番地へ飛ぶ。サブルーチンコールで使用する。

他に重要な命令として、以下のものがある。

lui $1, 100      ; イミディエート値 100 を $1 レジスタの上位16ビットに格納する。

MIPSでは、命令サイズが32ビットであるため、32ビットの定数やアドレスを一命令ではレジスタに格納できない。そこで、lui 命令と addiu 命令などを組み合わせて使用する。アセンブリ言語には32ビット定数をレジスタに格納するマクロ命令があり、マクロ命令のために汎用レジスタのうちのひとつをアセンブリ言語に固定的に割り当てている。

[編集] コンパイラによるレジスタ使用法

ハードウェアアーキテクチャ上、汎用レジスタの使用に次のような制約がある。

  • 汎用レジスタ $0 は常に内容が 0 であり、何を書き込んでも 0 のままである。
  • 汎用レジスタ $31 はサブルーチンコール時の jump and link 命令でリンクレジスタ(戻りアドレスを格納するレジスタ)として使われる。
  • HI レジスタと LO レジスタは整数の乗除算の結果を格納する。

これら以外に制約はない。

MIPSの用意したコンパイラなどのツール群は呼出規約の一環としてレジスタの使用法を規定している。これらの規定はハードウェアの制約ではないが、ツール群がこれに従っている関係で、MIPSアーキテクチャを採用したシステムではほぼ間違いなくこの規定に従ってレジスタを使用している。

レジスタ
名称 番号 用途 Callee must preserve?
$zero $0 常に 0 N/A
$at $1 アセンブラが一時的に使用 no
$v0–$v1 $2–$3 関数のリターン値または式評価の結果を格納 no
$a0–$a3 $4–$7 関数の引数 no
$t0–$t7 $8–$15 一時変数用 no
$s0–$s7 $16–$23 セーブされる一時変数用 yes
$t8–$t9 $24–$25 一時変数用 no
$k0–$k1 $26–$27 OSカーネル専用 no
$gp $28 グローバルポインタ(広域変数領域のベース) yes
$sp $29 スタックポインタ yes
$fp $30 フレームポインタ yes
$ra $31 リターンアドレス N/A

なお、"Callee must preserve?" とは、あるルーチンの中でそのルーチンに入ってきたときの値を保持した状態で呼び出した側に戻る必要があることを意味する。例えば、$s-レジスタをルーチン内で使うときは、その内容をスタックに一時的に退避させなければならない。$sp と $fp はルーチンに入ってきたときにセーブされ、それぞれルーチン固有の固定値でインクリメントされる。そして、そのルーチンから戻るときに元の値に戻す。一方 $ra は jal 命令でルーチンに飛び込むときに自動的に変更される。$t-レジスタはサブルーチンを呼び出すと内容が破壊されるので、必要なら呼び出す側がセーブしておかなければならない。$at はアセンブラの仮想命令(マクロ命令)で一時変数として使われる。$t-レジスタだけを使って、サブルーチンを呼び出すことがないルーチンは、スタックにレジスタをセーブする必要がないため、$sp や $fp もセーブする必要がない。

[編集] 関連するCPU

  • R2000 は、1985年リリースされた最初の32ビットMIPSアーキテクチャRISCマイクロプロセッサである。FPU として R2010 がある。クロック周波数が R3000 に比較して低い点やキャッシュメモリ容量が小さい点以外に違いはない。ただし、動作周波数が低いためCISCとの明確な性能差が無く、広く使われるには至らなかった。
  • R3000A は R3000 のクロック周波数向上版である。
  • R3000 と R3010 をワンチップ化したマイクロプロセッサとしては、R3400(Pacemips)、R3500IDT)、VR3600NEC)がある。
  • R3900東芝が開発した R3000 コアを使用したマイクロコントローラで、Windows CE を搭載した初期のハンドヘルドPC向けに開発された。

[編集] 関連項目

[編集] 外部リンク


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -