次のページ 前のページ 目次へ

11. ISA Bus について

本文書のこの項以降は技術文書です。ISAPnP について、より深く、理解したい人向けに 書いてありますが、ハードウェア、C 言語、kernel の基礎知識があることを 前提にしています。

11.1 ISA Bus の歴史と特徴

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 は生き残っています。 その理由として、下記に幾つか挙げておきます。

しかし、Microsoft 社と Intel 社の提唱する PC のハードウェア標準規格、 PC 98 Hardware Design Guideでは、 ISA Bus の搭載は不可となってしまいました。 今後、自作する人に対し PCI Bus インターフェース用 LSI が安価で提供され、 PCI Bus が ISA Bus のように簡単に使えるようになったとき、ISA Bus は無くなる だろうと思います。

11.2 現在の 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 時代のタイミングとほぼ、 同じです。

11.3 ISA Bus と PC/AT の問題点

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 上にある他の装置(スロット)は反応しません。

11.4 I/O アドレス空間について

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 が 最上位ビットになっています。


次のページ 前のページ 目次へ