+-------+ +-------+ +-------+ | CPU | | Memory| | I/O | +-------+ +-------+ +-------+ | | | | | | | | | <-|--|--+------|--|--+-------|--|--+------> Address Bus <-|--+---------|--+----------|--+---------> Data Bus <-+------------+-------------+------------> Control Busこれらの I/O を動かす為にはそのための命令を書いてやる必要があります.CPU とメモリ間は豊富な命令があるのですが,I/O に関しては80系のCPU ですと IN , OUT の2つの命令が基本的にあるだけです.IN は I/O からデータを入力する事を意味し,OUT はデータを出力する事を意味しています.
+-----+ -IOR +-----+ | |--------->| | | | -IOW | | | CPU |--------->| I/O | | | data | | | |<========>| | +-----+ +-----+さて68系については詳細はわからないのですが,メモリ空間と I/O 空間と言う概念はなく,メモリ空間に I/O を割り付ける様になっています.この方式をMemory Maped IO 方式と呼びます.68系ハードウェアに関してはよくわかりませんが入力と出力の制御線は80系みたいに分かれておらず,統一された制御線だと推定します.________ _______ IOR |_______| . . _______|_ _|_______ IOW | |___| | | | | ______ |_____V_| ______ data ______X_________X______
80系と68系どちらの方が良いとか悪いとかはないのですが,慣れの問題でしょうなぁ・・(^^;;
通常処理 | | +----------+ +----------> | 割込処理 | +----------+ | +<----------------+ | V
----------
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 が成り立つわけです.
しかしながら最近の CPU は非常に高速にデータ転送が可能なため DMA が必ずしも早いとは言い切れなくなっています.特に NEC PC9801 の昔の製品は,DMA よりも 80286 CPU のブロック・データ転送命令でデータを転送した方が早いのは,パソコンのアーキテクチャの作り方なんでしょうなぁ...
さて Pentium マシンについては PIIX という PCI-ISA ブリッジの LSI 内部に DMAC があり,それがシステムの DMA 制御をしています.未だに ISA を引きずっていますのでこのようなアーキテクチャになっていますが,将来的に ISA が完全に無くなると思いますので PCI 上だけの DMA のみになるのでは?と思っています.