次のページ
前のページ
目次へ
本文書のこの項以降は技術文書です。ISAPnP について、より深く、理解したい人向けに
書いてありますが、ハードウェア、C 言語、kernel の基礎知識があることを
前提にしています。
ISA Bus は 1983 年に IBM 社が発売した、8088 CPUを搭載した PC/XT の I/O チャ
ネルがもとになっています。この I/O チャネルは 62 ピンのコネクタを使用しています。
1984 年 に IBM社 は 80286 CPU を搭載した PC/AT を発売します。これに、伴っ
て I/O チャネルも拡張され、PC/XT のものに 36 ピンのコネクタを追加しました。
PC/AT は多数の互換機が作成され、その互換機メーカたちにより、PC/AT の
I/O チャネルは ISA(Industry Standard Architecture) Busと呼ばれるように
なりました。多くの PC/AT 互換機には 6 本の 62 + 36 ピンのスロットと、
2 本の 62 ピンのスロットの合計、8 本の ISA Bus スロットがありました。
ISA Bus は PC/XT 由来の 62 ピンのスロットには、アドレスバス 20bit、
データバス 8bit、割り込み 6 本、DMA 3 組があります。
PC/AT で追加された 36 ピンのスロットには、アドレスバス 上位 7bit、データ
バス 上位 8bit、割り込み 5 本、DMA 4 組があります(80286 CPU のアドレス
は 24bit なので、4bit の追加で足りるはずですが、何故か 7bit 増えています)。
これら以外に、CPU との制御線、クロック、リセット、電源があります。
Bus クロックは CPU のクロックに依存し、6MHz,8MHz,10MHz 等がありました。
ISA Bus の信号線は、80286 CPU, DMA コントローラ 8237A、割り込み
コントローラ 8259A に接続されていて、これらのデバイス固有のタイミングで
制御されています。ISA Bus は 80286 CPU 専用のバスだったといってもよいでしょう。
x86 系の CPU は I/O アドレス空間をメモリ空間とは別に持っています。
I/O アドレス空間は 16bit 長ですが、80286 時代の PC/AT 用拡張カードの
中には下位 12bit しか見ていないカードや、1 個の I/O アドレスしか
使用していないのに、8 個の I/O アドレスを浪費するカードがありました。
PC/AT とその互換機のマザーボード上の I/O 装置には、キーボートコントローラ、
タイマ、リアルタイムクロック(RTC 時計)しか搭載されていません。
ビデオ、シリアルポート、プリンタポート、ハードディスク・フロッピーディスク
コントローラ、拡張メモリ等は ISA Bus にアタプタ(拡張カード)を挿して、
使用しました。これではスロットが足らないため、シリアル、パラレル、ハード
ディスク・フロッピーディスクコントローラカードを 1 枚にまとめた
マルチ I/O カードや、サウンド、SCSI、CDROM コントローラ、ジョイ
スティック・マウス コントローラを 1 枚にまとめたお楽しみカードというような
カードが登場しました。
80386 CPU が出現したとき、ISA Bus は 80386 CPU に対応できませんでした。
また、高速なメモリは ISA Bus に置くと誤動作するので、CPU のすぐそばに
置くようになりました。その後、80486 や Pentium が出現し EISA や、
高速ビデオカードに対応した VL Bus が採用されたこともありました。
そして、高速で、CPU に依存しない PCI Bus 規格が登場し、PC/AT 互換機の
標準 Bus は ISA Bus から PCI Bus に移りました。
新しい Bus が PC/AT 互換機に採用される度に ISA Bus は消えて無くなるだろう
といわれてきました。しかし、今のところ ISA Bus は生き残っています。
その理由として、下記に幾つか挙げておきます。
- ISA Bus と周辺機器のインターフェースが簡単な回路で実現できること。
- 自作のカードや、安価なカードが多数存在したこと。
- ISA PnP により、拡張カードの取り扱いが楽になったこと。
- PCI が ISA Bus リソースと重ならないように実装されたこと。
- ISA Busで十分な性能が得られる用途があること。
しかし、Microsoft 社と Intel 社の提唱する PC のハードウェア標準規格、
PC 98 Hardware Design Guideでは、
ISA Bus の搭載は不可となってしまいました。
今後、自作する人に対し PCI Bus インターフェース用 LSI が安価で提供され、
PCI Bus が ISA Bus のように簡単に使えるようになったとき、ISA Bus は無くなる
だろうと思います。
2000 年現在の ISA Bus と CPU Pentium III とは下図 1 のように接続されています。
DRAM AGP USB Super I/O chip
| | | |
Pentium III -- GTL Bus -- North Bridge -- PCI Bus -- South Bridge -- ISA Bus
| | |
+------- IO APIC (interrupt) -----------------------+--------------+
図 1 Pentium III と 440BX Chip セット
図 1 を説明します。
- Pentium III
現在の最新 CPU です。
- GTL Bus
最新の CPU (Pentium II や Celeron等を含む)の Bus の名称です。Bus クロック
は 100MHz です。
- North Bridge
CPU と DRAM,AGP,PCI Bus インターフェース機能が受け持ちます。
型番は 82443BX です。
- South Bridge
昔の PC/AT のマザーボードに搭載されていた機能、割り込み、DMA,RTC 等、
PCI Bus 接続の ATA(IDE)インターフェースや USB と PCI-ISA Bus Bridge 機能
を持ちます。型番は 82371EB です。
- Super I/O chip
フロッピディスク、パラレル・シリアルポート、キーボード、マウス
インターフェースを持ちます。 ISA Bus に接続されています。各社から提供され
ています。
- IO APIC
新しい、割り込みコントローラです。PC/AT の割り込みを拡張し、16 個以上の
割り込みが使え、PCI Bus とISA Bus の割り込みを別にできます。
型番は 82093AA です。
もともと 8088/80286 CPU のそばにあった ISA Bus は、何段ものインタフェースを
経由して、Pentium III と接続されています。
ISA Bus のタイミングは クロック 8MHz の、80286 時代のタイミングとほぼ、
同じです。
ISA Bus の問題点は、PC/AT 互換機の問題と言い換えることができます。
- リセットの問題
x86 系の CPU で 8086(8088)と同じ動作をリアルモードといいます。
x86 系の CPU は 最新の Pentium III も含めて、CPU を リセットすると、
このリアルモードになります。プロテクトモードは様々な保護機能や、仮想メモリ
機能を持つモードのことです。
80286 CPU は機械語命令で、リアルモードから、プロテクトモードに移行できます
が、プロテクトモードから、リアルモードに戻る機械語命令を持っていませんでし
た。80286 CPU 時代の幾つかのプログラムはリアルモードで無いと動作しないもの
があるため、リアルモードに戻るため、CPU をリセットするハードウェア
を PC/AT 互換機に追加しました。キーボードコントローラの出力ポート
(I/O アドレス 0x64) の bit 0 に 0 を書き込むと、リセットできるので、
キーボードリセットと呼ばれています。
この、キーボードリセットでは ISA Bus はリセットされません。
ISA Bus がリセットされるのは、電源投入時だけです。
- I/O アドレスの問題
x86 系の CPU は 16 bit の I/O アドレスを持っています。PC/AT では、アドレ
ス 0x0000 から 0x00FF までを、マザーボード上で使用し、
拡張カードは 0x0100 から 0x03FF までを使用します(合わせて 10bit 1024バイト
になります)。
ところが、どちらも I/O アドレス 16bit を完全デコードせず、手を抜いています。
マザーボードでは、I/O アドレス の bit15 から 10 を無視し、
しかも、bit9 と bit8 がともに 0 の時、選択されてしまいます。
拡張カードは I/O アドレスの bit15 から 10 を無視しています。
そのため、I/O アドレス空間は イメージ(ゴースト)だらけになっています。
つまり、マザーボードでは 0x0000,0x1000,0x2000... は全て同じ I/O が反応し、
拡張カードでは 0x0100,0x0400,0x0800... は全て同じ I/O が反応してしまいま
す。
さらに、1 個の I/O アドレスしか必要が無くとも、マザーボード上では、
最低単位でも 16 個、多くの拡張カードでは 8 個の I/O アドレスを浪費しています。
この手抜きは デコーダ回路を簡素化するために行われましたが、
I/O アドレスに連続した広い領域を取ることができません。
- DMA の問題
PC/AT の DMA コントローラは (大昔の) 8080 用の 8237A を使用しています。
8237A はアドレス空間 16bit 、データ幅 8bit なので、64kbyte までしか転送でき
ません。PC/AT では、かなり複雑な方法で 8237A を 2 個使用し、
データ幅 16bit の転送ができます。また 8bit のレジスタを使用し、
アドレス空間 24bit に拡大されています。ただし、一度に転送できるデータ長は、
16bit までに、制限されています。
さらに、DMA の転送速度は現在の CPU のプログラム転送速度に劣ります。
- 割り込みの問題
x86 CPU 自体は 2 本の割り込み線があります。NMI と INT です。
NMI は 割り込み禁止にすることができないもので、主に致命的なエラー(メモリの
異常や、電源が落ちた等)の時に使用します。
INT は 割り込み禁止にできることと、割り込み発生時 8bit の割り込みベクタを
読み込むことで、256 個の割り込みに対応できます。
PC/AT では 割り込みコントローラ 8259A を 2 個使用し、15 個の割り込みが
使用できます。8259A は 8本 の IRQ 端子を持っていて、IRQ 端子毎に別々の
割り込みベクタを設定(プログラム)できます。8259A を 2 個使うためには、
一方の IRQ 端子を他方の 8259Aの端子のために使うため、16 個ではなく 1 つ足り
ない、15 個の割り込みになります。
これらの割り込みをハードウェア割り込みといいます。
また、x86 系 CPU にはソフトウェア割り込み機械語命令(ニーモニックは INT です)が
ありますが、ハードウェア割り込みと同じように動作します。
8259A が 割り込みベクタ 8 を出力し、CPU の INT 端子を有効にしたことと、
ソフトウェア割り込み機械語命令 INT 8 の動作は全く同じで、CPU には区別が
付きません。8259A のレジスタを調べたり、IRQ 端子を有効にした、ハードウェア
に問い合わせて、ハードウェアかソフトウェアの割り込みを区別します。
これは、欠点とも利点とも考えられます。 欠点として、ハードウェアかソフトウェ
アか区別するプログラムが必要になることです。利点としては、ハードウェアが
動作していない(bugっていたり、まだ完成していない)ときに、ソフトウェアで
試験ができることです。
x86 系 CPU はベクタ番号から計算した、メモリ内容(勿論あらかじめ、値を設定
しておきます)をもとにしたアドレスへサブルーチンコールします。
PC/AT 発売当初は割り込みが 15 個もあれば、十分と考えられていましたが、
現在では、不足しています。
- Bus 速度の問題
ISA Bus の転送速度はピークでも、8Mbyte/sec 以下です。8bit 幅の I/O 命令で
ISA Bus をアクセスした場合 1Mbyte/sec を下回ります。
- 分離の問題
ISA Bus には、すべてのスロットに信号線が共通に配線されています。そのため、
ISA カード毎にアクセスする方法がありません。
同じ Bus 接続でも、SCSI は装置毎に、ID 番号を人手で重複しないように設定し、
その ID 番号を使い、装置を区別しアクセスしています。
PCI では装置(スロット)と PCI Bus コントローラを 1 対 1 に接続している
制御線があります。PCI では、この制御線を有効にすると、対応したひとつだけの
装置(スロット)が反応し、同じ Bus 上にある他の装置(スロット)は反応しません。
ISA Bus は I/O アドレス空間を使用し、ハードウェアを制御します。
I/O アドレス空間へのアクセスに関係する問題を下記に示します。
I/O アドレス空間の問題
x86 系 CPU は I/O アドレス空間をメモリアドレス空間と別に持っていますが、
I/O アドレス空間を持つ CPU は少数派なのです。何故、少数派かといえば、I/O アドレ
ス空間を別に持つ、必要は必ずしも無かったからです。
I/O のハードウェアがメモリと同じように、アクセスして、動作するように設計されてい
れば、問題は無いからです。I/O アドレス空間をアクセスする機械語命令や、
CPU の信号線やアクセスタイミングに I/O アドレス空間専用のものを用意する必要も無い
ので、I/O アドレス空間を持たない方が有利でした。
しかし、キャシュメモリの搭載、命令のスケジューラ、保護機能、CPU の高速化等により、
I/O アドレス空間を持つ方が有利となってきました。
その理由を下記に示します。
- キャシュメモリの搭載
メモリは CPU の管理下にあり、メモリ内容を変更するのは、原則として CPU だけです
が、ハードウェアは独自にメモリ内容を変更します。
メモリアドレス空間にハードウェアを割り当てる場合、その領域をキャシュ不可にする
必要があります。x86 系の MTRR はメモリアドレス空間にハードウェアを割り当てるとき
に使用されます。
- 命令のスケジュール
現在の CPU は複数機械語命令を同時に取り込み、並列に実行できるようになっていま
す。そのため、命令の実行順序や、メモリアドレス空間へのアクセス順序を変更すること
があります。ハードウェアに対し、実行順序やアクセス順序が変更された場合、誤動作す
る可能性があります。
- 保護機能
ハードウェアが割り当てられたアドレス空間では、メモリアドレス空間とは、異なる保護
機能が必要です。メモリアドレス空間では、読み出し不可、書き込み専用は意味のない、
保護ですが、ハードウェアでは有効な保護になります。また、読み出し不可、書き込み不
可、しかしアクセスは可能という保護もハードウェアではあり得ます。
さらに、これらの保護機能はビット単位で行う必要があります。
- CPU の高速化
CPU が高速化すれば、メモリへも高速にアクセス可能で、アクセスタイムは同一である方
が、有利でしょう。しかし、ハードウェアのアクセス速度は様々で、超低速のものもあり
ます。ハードウェアを同じ空間に割り当てるよりも、別の空間に割り当てた方が、
CPU Bus や メモリ Bus の設計が容易になります。
ハードウェアへのアクセス
ハードウェアへのアクセスに関連する話題を下記に示します。
- ハードウェアへのアクセスの特殊性
ハードウェアへのアクセスはメモリのアクセスとは、同じではありません。
下記にいつかの機械語命令のコードの例を示し、I/O とメモリとの違いを説明します。
コード 1
load io # io アドレスのデータを読み込む
load io
store io
store io # io アドレスへデータを書き込む
コード 2-1
load io
ioにアクセスしない処理
コード 2-2
ioにアクセスしない処理
load io
コード 3-1
load32 io # 32bit 単位でアクセス
and 0xff # 8bit 分を取り出す。
コード 3-2
load8 io # 8bit 単位でアクセス
コード 1 がメモリへのアクセスであれば、読み込んだデータを書き戻すだけですから、
無意味なコードでしょう。CPU によっては、機械語命令を実行しないかもしれません。
しかし、コード 1 がハードウェアへのアクセスの場合、この通りに、2 回読んで、2 回
書くように("読 読 書 書" と)実行する必要があります。
"読 書 読 書" や、"読 書 書 読" で
は動作しないように、設計されたハードウェアかもしれません。
コード 2 は最初にハードウェアにアクセスするか、後でハードウェアにアクセスするか
の違いですが、時間が経過すると、ハードウェアは別のデータを返すかもしれません。
コード 3 はアクセスするときのデータバス幅の違いです。読み込んだデータはともに
8bit の同じデータでしょう。しかし、32bit 幅のアクセスでは、24bit 分よけいな
アクセスをしています。そのため、ハードウェアの動作は全く異なるものになるでしょう。
また、同じ I/O アドレスへのアクセスでも、読み込みと書き込みの動作が異なることも、
ありますし、アクセスさえあれば、読み込み書き込みを問わないこともあります。
- I/O アクセスプログラムの問題
x86 系 CPU が I/O アドレス空間にアクセスする機械語命令を I/O 命令と
呼んでいます。I/O 命令のアドレッシングモードは、ふたつしかありません。
絶対アドレスと DX レジスタ間接です。
絶対アドレスアドレッシングモードは、I/O アドレスを直に指定するので、
機械語命令が ROM に書き込まれた場合や、プロテクトモードでは、
I/O アドレスを書き換えることはできません。また、アドレスは 0 から 255 の範囲に
限られます。
DX レジスタ間接アドレッシングモードは、DX レジスタに I/O アドレスを、
渡せば良いので、I/O アドレスを書き換えることができます。
ところが、x86 系 CPU は CPU レジスタの役割が固定されている上、レジスタが
少ないため、DX レジスタを他の用途に使用していることや、
プログラマが 8080 CPU 機械語に慣れていることから、
DX レジスタ間接アドレッシングモードはあまり使われませんでした。
Busが ISAPnP になっても、絶対アドレッシングモードを使用しているデバイス
ドライバがあり、リソースが衝突して、せっかくの PnP 機能が生かせないものが
あります(そう、いまでも) 。ただし、IBM PC/AT互換機では I/O アドレス 0 から 255
は システム I/O に使用しますので、ISAPnP カードには割り当てることはありません。
- バイトオーダの問題
エンディアンの問題とも、いいます。16bit 以上の整数値が 8bit 単位でどのように
メモリに格納されるかということです。x86 系の CPU では、最下位から、格納され、
その他の CPU (例えば 68k や Alpha)では、最上位から格納されます。
例えば、0x123456AB は x86 系では、"AB 56 34 12" の順に、 68k
では"12 34 56 AB" の
順に格納されます。それぞれに、利点があって、x86 系では、ビット数の拡張に
向いていて、68k では、可読性に富んでいます。
ビット数の拡張とは、現在 16bit のデータを格納するとき、将来を見越して、64bit の
領域を用意し、xx yy 00 00 ... のように、未使用領域を 0 にしておくと、
32bit でも、64bit でも、同じ先頭アドレスでアクセスできます。
ISAPnP (実は PCI も) コンフィグレーションレジスタは x86 系のバイトオーダに
なっています。
また、同種の問題として、最上位ビットの位置の問題があります。x86 系では、
32bit の場合、 bit31 が最上位ビットですが、ある CPU では bit0 が
最上位ビットになっています。
次のページ
前のページ
目次へ
|