バンク切り換え
バンク切り換えの最新ニュースをまとめて検索!
バンク切り換え(Bank Switching、ページングと呼ばれることもあるが、通常のその用語とはほとんど関係ない)は、1次元配列であるアドレス空間を多次元配列にする事により、アクセス可能なアドレス空間を拡張するものである。8ビットのマイクロコンピュータシステムで一般に使われた技術であり、アドレスバスを拡張せずにアクセス可能なRAMやROMの量を増やすことを目的としていた。
目次 |
[編集] 概要
かつてよく使われたタイプは、アドレス空間を2次元配列にする物である。たとえばアドレスバスが16ビットしか無く、まったく工夫されていない場合アドレス空間は65536ワードしか使えない。そこでたとえばアドレス0xc000番地から0xffff番地をバンク切り換えして二つの要素を持つようにすると、49152+16384×2=81920ワードを扱える様になる。この手法は、古くは磁気コアメモリとROMバンクを切り換えて、アドレス線を節約する方法に用いられた。8ビットパソコンでは最大メインメモリに匹敵するVRAMのアドレス空間をCPUにアクセスさせる為に使われた。メインメモリを64Kバイト搭載した8ビットパソコンにおいてCP/M、OS-9等を動作させる際に邪魔になるBASIC ROMをRAMに切り換える機能があった。
仮想記憶の普及によって単純なバンク切り換え機構は廃れた。仮想記憶においては、論理アドレス空間をページまたはセグメントと呼ばれる小さな単位に分割し、それぞれをアドレス変換機構において物理アドレスに結び付けている。現在の実装では、アドレス空間はプロセス・ページまたはセグメント・論理アドレスオフセットによって構成される3次元疎配列となる(仮想マシンモニタを使っている場合には4次元疎配列)。原理的にはバンク切り換えの発展系であるが、仮想記憶をバンク切り換えと呼ぶ事は無い。
また、RAMディスクはファイルシステム用であるが、同様にバンク切り換えメモリを用いるものもあった。
[編集] 拡張スロットへの応用
バンク切り換えを拡張スロットに応用し、拡張スロット毎にメモリページが異なるように設計し、全てのI/OをメモリマップドI/Oとすると、メモリやI/Oのアドレスが衝突するというトラブルを完全に防ぐことが出来る。 また、拡張スロットにROMを配置する場合に、CPUから見える論理アドレスを固定することが可能なため、メモリリロケーション機構を省く事が出来ることも長所として挙げられる。 このような拡張スロットの実装例としてMSXが挙げられる。
[編集] バンク切り換えの欠点
バンク切り換えでは、CPUのアドレスの他にページ切り換え用のレジスタが必要である。このレジスタは、少なくとも論理的(ソフトウェア的)にはCPUの外にあるのが一般的である(HD64180のようにCPUチップの中にこのページ切り換え用のレジスタを持っているチップも存在したが、プログラミング上は、CPU内部のレジスタとして扱われていなかった)。
このことはアドレスをCPU内部のレジスタとページ切り換え用のレジスタの2箇所で別々に管理することを意味する。 それはCPU内部のレジスタからページレジスタへの桁上がり等のハードウェアが実装されていないことになるため、配列等がページサイズより大きい場合等はソフトウェアでページを管理する必要が生じた。
これはソフトウェアの処理が必要な分、1次元アドレス管理より速度が低下し、またソフトウェアを必要とするということは、そのソフトウェアにバグが潜む可能性が生じるということであり、システムの信頼性の低下が起こった。
このようなバグの例として、一塊のデータがページ境界に配置される場合が挙げられる、これは大きさが2nバイトでは無い構造体の配列が、全体としてページサイズを超えた場合等に起こる。
また、大量のデータをメモリ間で転送する場合に、バンク切り換えを行いながら転送する処理が必要になるが、この処理はかなり煩雑になった。
バンク切り換え用のレジスタの仕様(接続されているI/Oアドレス等)は、たとえCPUが同一であっても、一般論として機種毎に異なっていたために、同一CPUでありながら非互換となる原因の一つとなった。
[編集] 実施例
[編集] 8ビットマイクロプロセッサ
Z80 や 6502 といった 8ビットマイクロプロセッサでは、メモリアドレスは 16ビットで表されるため、最大でも64Kバイトのメモリ空間しかアクセスできない。そのため、64Kバイト以上のメモリを搭載する 8ビットシステムでは、メモリは64Kバイト毎のバンク(あるいはページ)に分割して使用した。つまり、同時にアクセスできるメモリ空間は依然として64Kバイトであるが、バンクを切り換えることでそれ以上のメモリを使用可能としたのである。これによって搭載メモリ量は増加したが、プログラムが複雑化し、性能的にも若干低下する場合があった。たいていの場合、アドレス空間の広いプロセッサを導入するほうが高い効率を期待できる。
そのため、バンク切り換えは1980年代のコンピュータシリーズの延命措置として利用された。例えば Apple //e, //c や Apple /// は Apple II+ 用のソフトウェアを実行することができ、コモドール128 はコモドール64のソフトウェアを実行することができた(コモドール64自身も64KBのRAMとROMをバンク切り換えしていた)。この場合、互換性を保つために最初の64Kバイトは何もしなくてもアクセス可能にしていたのである。日本では、家庭向けのコンピュータの、MSXの拡張スロットや、PC-8800シリーズのメインRAM・VRAM空間などで、バンク切り換えで大容量メモリ空間を確保・搭載していた。
日立製作所 Z80上位互換CPUであるHD64180はバンク切り換えベースのMMUをCPUに内蔵し、アクセス可能なアドレス空間をZ80の64キロバイトから1MBに拡張した。
ファミリーコンピュータには本来バンク切り替え機能はなく、ROMカートリッジ側にコントローラを搭載することでバンク切り替えが行われた。ファミリーコンピュータはもともと扱える容量が少なく、ディスクシステムの登場によってROMカートリッジは終了となるはずであった。ところがバンク切り替えによって大容量ROMカートリッジを扱う手法が確立されると、読み込み速度の遅いディスクシステムの方が次第に廃れ、最終的にはディスクよりもカートリッジの方が大容量となっていた。
[編集] PC-9801におけるバンクメモリ
NECのPC-9801(とその後継)においては、16ビットマイクロプロセッサであるIntel 8086(とその上位互換CPU)が採用されたが、アドレス空間が1メガバイトしかなかったので、アプリケーション等のメモリ要求量の増大にともない、後述のEMSの国内での普及に先行して、バンク切り換え用メモリとしてのバンクメモリが開発された。各周辺機器メーカーからそれぞれ独自規格のバンク切り換え用メモリが発売され、対応アプリケーションやゲーム等も一部でそれぞれ発売された。その後、アイ・オー・データ機器が提唱した「I/Oバンク方式」によるバンク切り替えメモリ管理BMS(Bank Memory Specification) が制定され、複数のアプリケーション間の競合を避けるメモリ管理も行われた。バンクメモリだけでなくハードウェアEMS/プロテクトメモリにも兼用できる製品もあった。
しかし、BMSやそのドライバの制定・普及がEMSに遅れをとり、EMSの普及・デファクト化や、プロテクトメモリ/XMSの普及等により、互換性もないため、時代の流れで次第に廃れていった。なお、アプリケーションの互換性確保のために、80386以降のCPUで使用可能な、仮想バンクメモリドライバ、仮想BMSドライバと言うものも開発された。技術的には仮想86EMSと同様である。
[編集] EMS
Intel 8086アーキテクチャではアドレス空間が1メガバイトしかなかったので、EMSと呼ばれるメモリ管理方式が考案された。1988年、ロータス社、インテル、マイクロソフトは、MS-DOSを搭載したPC/AT互換機で使用するEMSの仕様について合意した。これはメモリ空間の一部を拡張し、より多くのメモリ資源にアクセスさせる為のメカニズムである。これは広く普及し、プロセッサの世代が交代しIntel 80286以降のようにMMUが搭載されるようになってからも使われ続けた(贅沢にもMMUは単なるバンク切り換えコントローラとして使われた)。EMSの仕様は互換性を保つために後のMicrosoft Windowsでもエミュレートされてサポートされていた。
[編集] その他
プロセッサを複数搭載する事でメインメモリにアクセスできるCPUとVRAMにアクセスできるCPUにと、担当を分割させるアーキテクチャもあった。これは負荷分散も同時に実現できるが、一つの筐体にコンピューターシステムを2つ分搭載させる故にコストは高くついた。
読み出しバンクと書き込みバンクを別途指定できるようにする事で、入力と出力を同じアドレスで行い、出力データの保持とアドレス計算を省く方式が考え出された(リード・モディファイ・ライト Read Modify Write)。これもまた画像処理に応用された。
モトローラ MC68000シリーズではブート時、アドレス0番地から2ロングワードにスタックポインタ初期値・ブートストラップへのアドレスをCPUに提示しなければならず、なおかつ稼動時にはさらに割り込みベクタをRAMにして書き換え可能にする必要があった事から、起動時のバンク切り換えは必須であった。
バンク切り換えはゲーム機でも使われた。任天堂のファミリーコンピュータは6502の派生プロセッサを使用していたが、そのゲームカートリッジは時にはメガバイト単位のROMを内蔵していた。また、ゲームボーイのカートリッジにはMBC(Memory Bank Controller)と呼ばれるチップが内蔵されており、メモリのバンク切り換えだけでなく、赤外線通信機構やモーターへのアクセスを可能にしていた。
最終更新 2009年8月27日 (木) 13:23 (日時は個人設定で未設定ならばUTC)。
【バンク切り換え】変更履歴



