7839

雑草魂エンジニアブログ

入出力と周辺装置

現在、CSの勉強のために、コンピュータアーキテクチャ (電子情報通信レクチャーシリーズ)を読んでいる。

ようやく最後の章になった。
CPUは様々な周辺装置と情報やりとりをしながら処理を進めている。CPUと周辺装置の情報交換のやり方についてまとめていく。

周辺装置の分類

CPUから見た入出力の周辺装置としては以下のようなものが挙げられる。

周辺装置をデータの送受信装置として見た場合、高いスループット、素早い応答、実時間性、高い頻度の入出力など、それぞれに要求されるものが異なる。この多様性を満足するためのインターフェースがコンピュータには必要となる。

各デバイスの原理や詳細に関しては今回省略するが、技術の発展に伴い、ハードウェアも大きく変わってきている。

ハードウェアインターフェース

CPUと周辺機器の接続は、通常バスを用いて行われる。

CPUや主記憶装置、入出力装置などのそれぞれの装置が共通の伝送路であるバスで接続されている。バスには以下の2種類がある。

  1. 内部バス(CPU内部バス)
    • CPU内部のデータのやり取りに使用する伝送路
    • CPU内部の制御装置や演算装置・キャッシュメモリなどのデータ・信号をやり取りするバス
  2. 外部バス
    • CPUと外部にある主記憶装置、周辺機器の間のデータのやり取りに使用する伝送路
    • システムバス
      • CPUや主記憶装置を接続する高速なバス
    • 入出力バス(I/Oバス)
      • 入出力装置を接続する低速なバス

また、上記のバスで伝送する信号に応じて3つの伝送路がある。

  • アドレスバス
    • メモリのアドレスや入出力装置(I/O)のアドレスを出力するために使われるバス
    • 線の本数を「アドレスバス幅」という
  • データバス
    • CPUと、メモリや入出力装置(I/O)との間でデータを転送するために使われるバス
  • コントロールバス(制御バス)
    • 各バスを制御するバス制御用のバス
    • アドレスバスやデータバスで実際に入出力を行うタイミングや、その他CPUと外部との間での必要な制御情報をやり取りするために使われるバス

データ転送の手順

周辺装置との入出力は、以下の手順で行われる。

  1. ポーリングまたは割り込みによる入出力の起動
  2. 前処理
  3. 命令またはDMA(Direct Memory Access)による主記憶・周辺装置間のデータ転送
  4. 後処理

ポーリングと割り込みの違い

  • ポーリング(polling)
    • CPUが定期的に順番に周辺装置を見回って、入出力の要求があるかどうかを確認する方式
    • メリット
      • 実装が簡単
      • CPU側の前処理・後処理が軽くて済む
    • デメリット
      • 入出力が即時的に行えない
      • 見回りのために無駄な時間が多く使われる
  • 割り込み(interrupt)
    • 周辺装置(のコントローラ)からCPUに対して割り込み信号を入れ、例外処理を要求して、入出力を行わせる方式
    • メリット
      • 待ち時間や見回り時間の問題を解決することができる
    • デメリット
      • CPUのハードウェアが複雑
      • 実行中の命令を中断することになるので、レジスタ退避やキャッシュの書き戻しなどが必要となり、前処理・後処理のオーバーヘッドがかかる

主記憶と周辺装置の間でのデータ転送方式

  • CPUを介してデータ転送を行う方式
    • メモリマップトI/O方式
      • 周辺装置にメモリアドレスを割り振り、メモリのロード・ストア命令でデータの読み書きを行う
      • メインメモリへアクセスするための命令と同じアドレス空間で扱う
    • I/OマップトI/O(I/Oアドレス)方式
  • DMA(Direct Memory Access
    • CPUを介さずに、直接メモリにアクセスしデータ転送を行う
    • 直接と書いたが、実際にはDMAC(Direct Memory Access Controller)を介して周辺装置自身でメモリにアクセスする
    • メリット
      • ハードウェアを使って周辺装置が直接データ転送をするので、高速・大容量のデータ転送が可能になる
    • デメリット
      • DMACが転送している間は、他のデバイスはメモリにアクセスできない

割り込みの調停

1つのバスに複数の入出力機器がつながっているため、割り込みの衝突が発生する可能性がある。複数の入出力機器からの割り込みに対して、1つを選択する必要がある。この調整を行うのが「アービタ(arbiter, 調停器)」である。

  1. 同じ優先度の割り込み要求は優先度ごとに決められたランダムアービタに繋ぎ込まれ、その中からランダムに1つを選ぶ。乱数的に選ぶことで、各要求に対する公平さを保証している。
  2. プライオリティエンコーダは、これらの中から優先度の最も高い割り込みを選び、それをエンコードしてCPUに送る。
  3. CPUが割り込みを許可すれば、周辺機器とCPU間でデータ転送が行われる。

例外処理

入出力に伴う割り込みは、例外処理(exception handling)を引き起こす。コンピュータでは様々な例外が発生するが、その性質に応じて優先度や処理内容が定められている。

例外とは、通常のプログラムにはない処理が必要な状態のことである。

優先度に関しては、一般的にハードウェアエラーが優先度が最も高く、次に命令実行による例外、最後にプログラム外割り込み、という順番になる。

例外処理の手順は以下の通りである。

  1. 例外処理の要因が発生したら、CPUはこれを受け付けるかどうか決める。複数の要因が重なった場合には、最も高い優先度の要因を1つ選択する。
    • 例外を受け付けるかどうかの判断は、例外に対するマスクレジスタ(mask register)が使われる。マスクレジスタには各ビットが例外の優先度に対応する。フラグが立っているときには対応する例外は受け付けられない。マスクレジスタの設定は、カーネルプログラムの特権命令だけ可能である。
  2. 受け付けることが決まった場合、現在実行中のプログラムの状態を退避する。具体的にはデータレジスタ、PC、状態レジスタなどをメモリ上の適切な場所に退避する。
  3. 例外処理のカーネルプログラムを起動する。カーネルプログラムは例外の要因を知って、必要な処理を行う。
  4. 例外処理が終わったら、必要に応じてPCなどの値を復帰し、元のプログラムの実行に戻る。

まとめ

これまでは主にCPU内部を見てきたが、今回CPUと周辺装置との繋がり、およびデータ転送方法について確認することができた。

例外や割り込みに関しては、もっと奥が深いのでもっと理解度を深めていきたい。

関連書籍