Hardware 用語集 I/O,IRQ,DMAとは?

【I/O とは?】

このページを見るときは固定等幅フォントを使用してください


I/O とは Input / Output Device の略であり,日本語では周辺機器とか周辺装置等といいます.コンピュータの基本的な構造は下の図のように中央演算処理装置(CPU),メモリ,そして I/O からなっており,I/O はコンピュータの中でも重要な位置を占めています.
I/O の種類には色々なものがありますが,代表的なものでは,パラレルポート,シリアルポート,キーボード,マウス,ビデオ,HDD 等があります.
 +-------+    +-------+     +-------+
 |  CPU  |    | Memory|     |  I/O  |
 +-------+    +-------+     +-------+
  |  |  |      |  |  |       |  |  |
<-|--|--+------|--|--+-------|--|--+------> Address Bus
<-|--+---------|--+----------|--+---------> Data Bus
<-+------------+-------------+------------> Control Bus
これらの I/O を動かす為にはそのための命令を書いてやる必要があります.CPU とメモリ間は豊富な命令があるのですが,I/O に関しては
80系のCPU ですと IN , OUT の2つの命令が基本的にあるだけです.IN は I/O からデータを入力する事を意味し,OUT はデータを出力する事を意味しています.
たとえば HDD からあるセクタのデータを 512 Byte 持ってくることを考えてみます.まず HDD に対してデータを持ってくる対象のセクタを特定する命令を OUT 命令により出します.対象セクタが特定出来ればデータを 512 Byte 持ってくる様に IN 命令を繰り返し出す必要があります.しかしながらこれらの事をいちいち色々なプログラムが行ったのでは非常に面倒となります.よってこれら種々の機器・装置等を動かす為の基本的な命令の固まりをコンピュータは持っています.これがBIOS(バイオスと読みます)です.ちなみにBIOS は更に色々な作業をするための命令をももっていますので・・・(^^;
さてハードウェアに関して I/O は80系と68系ではちょっと違っています.80系は I/O 空間とメモリ空間が別になっており,そのためにハードウェアの制御線や命令が異なるのです.
80系についてハードウェアを多少詳しく(それでも簡略ですけど・・)書くと下図のようになります.IOR はデータを入力するための制御線であり,IOW はデータを出力するための制御線になります.入力の場合には IOR 信号が,出力の場合には IOW 信号がタイミング図のように一度下に下がり(この状態を LOW Level と言う)再び上がる(この上に上がった状態を HIGH Levle と言う)時にデータを入力または出力します.これは専門用語で”立ち上がりエッジでのデータの取り込み”と言います.
ちなみにこの方式を IO Maped IO 方式と言います.
コンピュータはこのような単純な作業を繰り返すことで色々な機器・装置を制御し色んな事が出来るように見えるのです.
+-----+  -IOR    +-----+
|     |--------->|     |
|     |  -IOW    |     |
| CPU |--------->| I/O |
|     |  data    |     |
|     |<========>|     |
+-----+          +-----+

    
         ________        _______
    IOR         |_______|
                .       .
         _______|_     _|_______
    IOW         | |___| |
                |     | |
         ______ |_____V_| ______
    data ______X_________X______
さて68系については詳細はわからないのですが,メモリ空間と I/O 空間と言う概念はなく,メモリ空間に I/O を割り付ける様になっています.この方式をMemory Maped IO 方式と呼びます.68系ハードウェアに関してはよくわかりませんが入力と出力の制御線は80系みたいに分かれておらず,統一された制御線だと推定します.

80系と68系どちらの方が良いとか悪いとかはないのですが,慣れの問題でしょうなぁ・・(^^;;


【IRQ とは?】


IRQ とは Interrupt Request を意味します. これは I/O が CPU に対して突発的な事柄が発生したことを知らせるために使用します. 主にプログラム処理において処理が行われていた場合,I/O に突発的な事柄が発生した場合に CPU に対して IRQ 信号を発生させます. CPU では IRQ 信号が来たときには今まで行われていた処理(通常処理)を一時的に中断して,突発的な事柄に対する処理を行い,その突発的なしょりが終了した段階で一時的に中断した通常処理に戻ります.
      通常処理
        |
        |            +----------+
        +----------> | 割込処理 |
                     +----------+
                          |
        +<----------------+
        |
        V

【DMA とは?】


【タイミング図等はかなり簡略して記載しておりますのでご了承ください】
DMA は Direct Memory Access を意味します.これは I/O と memory と CPU のデータのやりとりの問題です.基本的に80系の CPU は I/O からメモリへのデータ転送は CPU のレジスタ(一時記憶する場所と今は思ってください)に一度入力され,その後メモリへ書き込まれます.つまり直接 I/O からメモリへデータを転送する命令が無いわけです.またその逆,つまりメモリから I/O へデータを転送する命令はありません.
そこでメモリ〜 I/O 間のデータのやりとりをハードウェア的に行おうと言うのが DMA 方式です.

----------
DMA についてはいくつかの利点がありますが,その1つとして昔のCPUは命令読み,デバイス(I/Oやメモリーの読み書き)を動作させる時間が長かったので、命令読む時間を少しでも省く意味としてDMAの存在意義があったようです.今でもこの点については当てはまりますが,CPUが早くなった今本当に若干の効果しか無いのではと思います.
(尚この部分は栗原様のご指摘により追加いたしました.ご指摘ありがとうございます)
----------

さてここで1つの例を示します. I/O からメモリへデータを転送する事を考えます.通常は図a の様に I/O から CPU へデータを転送し,CPU からメモリへデータを転送する事になります.これだと 図a における (1)(2) の様に2段階のデータのやりとりが必要になります.ではこれの面倒を解決するためにはどの様にすればよいのでしょうか.それは図b の様に I/O からメモリへデータを直接転送出来れば良いのです.

    +-----+ +--------+ +-----+      +-----+ +--------+ +-----+
    | CPU | | Memory | | I/O |      | CPU | | Memory | | I/O |
    +-----+ +--------+ +-----+      +-----+ +--------+ +-----+
      A |       A         |                     A         |
      | |  (2)  |         |                     |   (1)   |
      | +-------+         |                     +---------+
      |           (1)     |
      +-------------------+
              図a                              図b
しかしながら CPU にはこのような I/O からメモリへ直接データを転送する命令がありません.これはメモリと I/O を同時に読み書きするタイミングが 80系の CPU には無いためです.この為 CPU を使用する図a の方式ですと下図の様なタイミング構成となります.
            _______         _______________
    IOR            |_______|
                   .       .
            _______|_______|__      _______
    MEMWR          |       |  |____|
                   |       |       |
                   |_______| ______V_
    data    ------<_________X________>-----

                 (1)IO Read (2)Memory Write
では本当に何かいい方法は無いのでしょうか?これを解決するのがDirect Memory Access 方式【DMA】 です.ハードウエアの構成は図c の様になります.ここで新しいハードウエアがあります.DMAC(DMA Controler) であり,この DMAC は下図のタイミング図のように IO の読み書き信号とメモリの読み書き信号を同時に出すことが出来る様になっています.
    +-----+ +--------+ +-----+          ________         ______
    | CPU | | Memory | | I/O |  IOR            |_________|
    +-----+ +--------+ +-----+                 .         .
              A A       A |             _______|_      __|_____
              | |       | |     MEMWR          | |____|  |
              | +-------|-+                    |      |  |
    +------+  |         |                      |______V__|
    | DMAC |--+---------+       data    ------<___________>----
    +------+
              図a
このときアドレス・バスに出ているのはメモリの番地であり, I/O の特定は DMAC に対し入出力を I/O側が要求するする事で可能となります.つまり I/O からの転送要求で DMA が成り立つわけです.
転送要求を受けた DMAC はまず データバスやアドレスバス等に存在する CPU を無効にするように BUS Request 信号を出します.要求を受け取った CPU は要求のあった I/O と転送先のメモリ番地を確認し,DMA にそのデータをセットしたのち自分はバス上から切り離す様にします.つまり DMA が行われている間は CPU は動いていない事になります.
各種設定値を受け取った DMAC は指定されたメモリ番地のアドレスを出力し, I/O に対する制御及びメモリに対する制御信号を出力することで I/O 〜メモリ間の直接の転送を行います.
すべてのデータの転送が終了した時 DMAC は CPU にデータ転送が終了したとして BUS Request 信号を無効にします.その信号を受け取った CPU は DMA が行われる前の状態を復帰し,次の命令を実行していきます.

しかしながら最近の CPU は非常に高速にデータ転送が可能なため DMA が必ずしも早いとは言い切れなくなっています.特に NEC PC9801 の昔の製品は,DMA よりも 80286 CPU のブロック・データ転送命令でデータを転送した方が早いのは,パソコンのアーキテクチャの作り方なんでしょうなぁ...

さて Pentium マシンについては PIIX という PCI-ISA ブリッジの LSI 内部に DMAC があり,それがシステムの DMA 制御をしています.未だに ISA を引きずっていますのでこのようなアーキテクチャになっていますが,将来的に ISA が完全に無くなると思いますので PCI 上だけの DMA のみになるのでは?と思っています.



前に戻る
最初へ戻る