バンク切り換え
[Wikipedia|▼Menu]

バンク切り換え(バンクきりかえ、Bank Switching[1])はコンピュータメモリ内のアドレス空間を、1次元配列から多次元配列にする事によりアクセス可能なアドレス空間を拡張する技術である[2]ミニコンピュータで生まれた技術である[3]。8ビットのマイクロコンピュータシステムで一般に使われた技術であり、アクセス可能なRAMROMの量をアドレスバスを拡張せずに増やすことを目的としていた。
概要古典的なバンク切り換えのイメージ

かつてよく使われたタイプは、アドレス空間を2次元配列にする物である。たとえばアドレスバスが16ビットしか無く、まったく工夫されていない場合アドレス空間は65536ワードしか使えない。そこでたとえばアドレス0xc000番地から0xffff番地をバンク切り換えして二つの要素を持つようにすると、49152+16384×2=81920ワードを扱える様になる。この手法は、古くは磁気コアメモリROMバンクを切り換えて、アドレス線を節約する方法に用いられた。8ビットパソコンでは最大メインメモリ空間に匹敵するVRAMのアドレス空間[4]や、テキストVRAM等を、主記憶容量を確保しつつ、CPUからアクセスさせるために使われた。また、メインメモリを64Kバイト搭載した8ビットパソコンにおいて、初期ローダからのロードしたシステムへの遷移、書き換えの不可能なROM空間をRAMとして、ユーザーに開放するためなどの切り替えにも用いられている。これらの実装により、予め実装されているROMに書き込まれているもの以外のシステムの利用や、より自由度の高い利用が可能となった。

仮想記憶の普及によって単純なバンク切り換え機構は廃れた。仮想記憶においては、論理アドレス空間をページまたはセグメントと呼ばれる小さな単位に分割し、それぞれをアドレス変換機構において物理アドレスに結び付けている。現在の実装では、アドレス空間はプロセスページまたはセグメント・論理アドレスオフセットによって構成される3次元疎配列となる(仮想マシンモニタを使っている場合には4次元疎配列)。原理的にはバンク切り換えの発展系であるが、仮想記憶をバンク切り換えと呼ぶ事は無い。
バンク切り換えの欠点

バンク切り換えでは、CPUのアドレスの他にページ切り換え用のレジスタが必要である。このレジスタは、少なくとも論理的(ソフトウェア的)にはCPUの外にあるのが一般的である(HD64180のようにCPUチップの中にこのページ切り換え用のレジスタを持っているチップも存在したが、プログラミング上は、CPU内部のレジスタとして扱われていなかった)[5]

このことはアドレスをCPU内部のレジスタとページ切り換え用のレジスタの2箇所で別々に管理することを意味する。それはCPU内部のレジスタからページレジスタへの桁上がり等のハードウェアが実装されていないことになるため、配列等がページサイズより大きい場合等はソフトウェアでページを管理する必要が生じた[6]

これはソフトウェアの処理が必要な分、1次元アドレス管理より速度が低下し、またソフトウェアを必要とするということは、そのソフトウェアにバグが潜む可能性が生じるということであり、システムの信頼性の低下が起こった。

このようなバグの例として、一塊のデータがページ境界に配置される場合が挙げられる、これは大きさが2nバイトではない構造体の配列が、全体としてページサイズを超えた場合等に起こる。

また、大量のデータをメモリ間で転送する場合に、バンク切り換えを行いながら転送する処理が必要になるが、この処理はかなり煩雑になった。

バンク切り換え用のレジスタの仕様(接続されているI/Oアドレス等)は、たとえCPUが同一であっても、一般論として機種毎に異なっていたために、同一CPUでありながら非互換となる原因の一つとなった。

また、必ずしもその空間がCPUが持つアドレス空間内に無いため、単純なバンク切り替えの場合、その実行コードの場所が限定された。例えば、VRAMが出現するアドレスに描画を伴う処理をおくことは、VRAMが排他的にそのアドレスのメインメモリの代わりにその場所に出現することになるので、不可能となる。同様に、バンク切り替えで実装されたROMのルーチンをコールするためには、それを呼び出すプログラム自身が存在している場所以外のページに、該当する処理のあるROMを接続の上、処理する必要がある。
実施例
8ビットマイクロプロセッサ

Z806502 といった 8ビットマイクロプロセッサではメモリアドレスは 16ビットで表されるため、最大でも64Kバイトのメモリ空間しかアクセスできない。そのため、64Kバイト以上のメモリを搭載する 8ビットシステムではメモリは64Kバイトの空間を複数のバンク(あるいはページ)に分割して使用した。つまり、同時にアクセスできるメモリ空間は依然として64Kバイトであるが、バンクを切り換えることでそれ以上のメモリを使用可能としたのである。

その仕組みはいくつかの発展を遂げ、メモリマップドI/Oと組み合わせ四つの空間を「スロット」として扱い、接続アドレスの移動こそできないものの、ハードウェアのI/Oと制御プログラムの接続とその競合を防ぐ仕組みがMSXには実装されている。メモリ空間に接続されるアドレス間の移動は不可能であるため、その組み合わせによっては配置に制限が発生する。

その後、MB-S1FM-77MZ-2500ではメモリをページ単位で空間に割り当てる原始的なメモリ管理ユニットが内蔵されるようになり、より自由に配置できるようになった。前述のMSXでも、固定だったアドレスや組み合わせの制限等を回避するため、MSX2においてメモリマッパという仕組みが追加された。

1982年にリリースされた最終バージョンのCP/Mでは、8080やZ80で64KB以上のメモリを使えるようバンク切り換えをサポートしていた[7]
ゲーム機

バンク切り換えは初期のゲーム機でも使われていた[8]。例えば Atari 2600 は4KBまでのROMしかアクセスできないため、ロムカセット内に独自のバンク切り換えハードウェアを内蔵して4KB以上のROMを使った洗練されたゲームを実現していた[9]

ファミリーコンピュータには本来バンク切り換え機能はなく、ROMカートリッジ側にコントローラ(Virtual Rom Controller など)を搭載することでバンク切り換えが行われた。ファミリーコンピュータはもともと扱える容量が少なく、ディスクシステムの登場によってROMカートリッジは終了となるはずであった。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:22 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef