ハードウェア入門
書誌
| text | 唯野 |
| author | 太田純 |
| publisher | ソフトバンク |
| year | 『Cマガジン 2001.5』p.12-27 |
履歴
| 2001.7.23 | 読了 |
| 2001.7.23 | 公開 |
| 2002.11.28 | 修正 |
感想
自分に欠けていた部分ともいえる PC を構成するハードウェアについて扱った記事。私も PC の自作などはしているが、肝心のメモリが例えばどんな仕組みになっているかなどには無頓着で、あまり詳しい知識を持ち合わせていなかったため、とてもためになった。知識がないため、記事中の内容を本当にそのまま要約しただけともいえる内容になってしまっているが、これは単純に自分の能力不足である。自分なりのより深い知識を得られるようにしたいと思う。
抄録
現代の計算機のほとんどはノイマン(John von Neumann)が提唱したプログラム内蔵式計算機の原理に基づいている。これはプログラムを計算機内部の一連の命令の列として表現し順に実行していくもので、この方法によりあらゆる計算処理の可能なことがチューリング(Alan Mathion Turing)によるチューリング・マシンで証明されている。現代の計算機には様々な種類があるが、ハードウェア構成の基礎となるモデルはほぼ同じであり以下の要素が挙げられる。
| 中央処理装置(CPU) | 演算装置(命令の実行)と制御装置(周辺装置とをつないで計算機全体を管理) |
| 主記憶装置(メモリ) | CPU の実行する命令やデータを記憶する、現状では半導体メモリが一般的 |
| 補助記憶装置 | 主記憶に収まりきらないデータを格納したり、永続的な保存を行うのに使う、ハードディスクなど |
| 入力装置 | 計算のためのデータや指示を送る、キーボードやマウスなど |
| 出力装置 | 計算結果を外へ送り出すもの、ディスプレイやプリンタなど |
CPU
CPU は計算機における頭脳の役割を担うが、プログラムを与えられなければ単なる箱に過ぎない。プログラムが実行されると、命令をメモリから読み出して実行する。このとき CPU が持つ次に実行される命令アドレスの入った場所のことをプログラムカウンタ(PC)といい、プログラムの実行とはプログラムの先頭番地を PC にセットすることで、これを特に「制御を移す」と呼ぶ。計算機は電源投入直後にはプログラムカウンタに特定の番地がセットされる。通常、これは ROM に収められた IPL (Initial Program Loader) という初期化プログラムで、IPL がシステム全体を初期化し、補助記憶装置から OS を読み出す。OS がメモリ上に読み込まれると制御が OS に移行する。
機械語命令とは CPU が理解・実行できるかたちの命令のこと。C などのプログラムはそのままでは機械が実行できないため、コンパイラによって機械語命令へ変換し実行可能プログラムとする必要がある。この機械語命令は処理内容の命令部と処理対象のオペランドから成る。CPU が処理対象として自然に扱えるデータのことをワード、ワードのビット数を CPU のビット幅と呼ぶ。また、CPU の解する命令のまとめたものが命令セットで、CPU によって幅はあるが基本的に以下があり、それ以外には入出力命令や OS のための割り込み命令などがある。(比較命令 + 分岐命令で if や while、呼出し命令 + スタックで関数呼び出しが実現できる。)
| 演算命令 | CPU が持つワード幅のレジスタで演算が行われ、結果に応じてゼロフラグ、負フラグ、キャリーフラグなどのレジスタフラグに値がセットされる。これが条件分岐命令で参照されたりする。ほかに比較命令など。 |
| 転送命令 | 特定番地のメモリとレジスタ間でデータ転送を行う。転送命令がオペランドとしてアドレスの指定する場合をアドレッシングモードという。ほかにスタック操作命令があり、このためのスタックポインタという特殊なレジスタがある。 |
| 分岐命令 | プログラムカウンタの内容を書き換えて指定されたアドレスに飛ぶもの。 |
このうち分岐命令は更に以下に分かれる。
- 条件分岐命令 フラグレジスタを参照してフラグがセットされていれば分岐する
- 呼び出し命令 戻り先アドレス(次の命令アドレス)をレジスタに保持しておき、ジャンプ呼び出しから戻るときに復帰命令を使う
命令セットの持ち方には大きく分けて CISC (Comlex Instruction-Set Computer : 複雑命令セット計算機、x86 など) と RISC (Reduced Instruction-Set Computer : 縮小命令セット計算機、SPARC など) がある。CISC は高性能な機械語命令を使うもので高級言語との対応がよくなる反面、CPU 構造が複雑になる欠点を持つ。CISC の命令の一部となるソフトウェアのことをマイクロプログラムというが、この場合、若干速度が犠牲になる。一方、RISC は命令を単純なものだけに絞りハードウェアだけを使う。コンパイラの負担が増えプログラムサイズも大きくなるが、低価格で高速な CPU を実現できる特徴がある。
一般にマルチユーザ OS をサポートするような CPU では特権モードと呼ばれるモード管理が実装されている。特権モードとは CPU の状態のひとつのことで、この状態でしか実行できない命令・操作を持つ。通常は OS が特権モードで動作してユーザプログラムへのメモリ割り当てなどを行い、ユーザプログラムは非特権モードで動作してこれらの命令を使わない。大抵の CPU ではこの切替を割り込み命令(ソフトウェア割り込み)で行う。割り込み命令ではオペランドの割り込み番号を元に割り込みベクタと呼ばれる表で管理されたアドレスへ飛ぶ。割り込みベクタのアドレスはシステムコールと関連付けられることが多く、割り込みに対応するシステムコールを呼び出して終了すると割り込み復帰命令で非特権モードに戻る。他にユーザプログラムによる不適切なアドレスへのアクセスやゼロ除算でも、OS は例外ハンドラへ制御を移して特権モードでその対処を行う。
一方、CPU 内部は主に制御部、演算部、レジスタ群で構成されている。制御部で機械語命令の解釈・データ入出力などを行い、演算部で命令に従った演算を処理し、必要に応じてレジスタにアクセスする。演算部はクロックに従って処理が管理される。以下に CPU での処理の流れを示す。
- 制御部が PC のアドレスから機械語命令を読み出す
- 制御部が機械語命令を命令とオペランドに分け、命令を識別する
- 制御部が命令に従って演算部に指令を出し、オペランドを渡す
- 演算部は制御部の指示に従って演算し、結果をレジスタに書く
- 演算が終わると制御部に制御が戻って最初に戻る
CPU は制御バスと呼ばれる信号線の集まりによって外部に接続されている。(様々なデータが相乗りするのでバスという。)信号線には用途に応じてアドレス送受信に使うアドレスバス、データ送受信に使うデータバス、信号識別や割り込み、クロック用の信号線などがある。アドレスバスやデータバスは CPU のビット幅に応じた本数の信号線を持っている。制御バスによるメモリ読み出しは次のような手順を踏む。
- CPU がアドレスバスにアクセスしたいメモリのアドレスを乗せる
- CPU がメモリ読み出し信号線に要求信号を乗せる
- メモリ制御回路は要求信号からアドレスバスのアドレスデータをデータバスに乗せる
- CPU がデータバスにあるメモリデータを読み出す
CPU を高速化するための技術としてキャッシュやパイプラインがある。キャッシュは CPU の近くにある小容量の高速なメモリのことで、CPU 内部のものを 1 次キャッシュ、CPU 外部のものを 2 次キャッシュという。CPU から見ればメモリも低速なため、頻繁に参照される内容をキャッシュすることで効率化を図っている。(キャッシュの外れのことをキャッシュミスという。)このときメモリへの書き込みには、内容をキャッシュとともにメモリにも書き込むライトスルーキャッシュ(読み出しが速く書き込みは遅い)と、内容をキャッシュにだけ書き込んでキャッシュから捨てられるときにメモリへ書き込むライトバックキャッシュとがある。
一方、パイプラインとは CPU 内部での流れ作業の経路のことで、複数の機械語命令を同時に並列で処理することを指し、その際の処理可能なステップ数のことをパイプラインの段数という。具体的には分岐命令に伴う処理の中断(パイプラインの乱れ)や処理位置の最適化(遅延分岐)、分岐予測(分岐発生予測)、投機実行(先読み実行)などを行う。
メモリ
メモリはデータを格納して高速な読み書きを実現する。プログラムやデータの一時的な記憶のために使われるものをメインメモリと呼び、CPU は直接メモリにアクセスして処理を行う。メモリを構成している半導体とは導体(電気を通す)でも絶縁体(電気を通さない)でもない物質という意味で、ゲルマニウム、シリコン(珪素)、ガリウム砒素などがある。(携帯電話などではガリウム砒素が、PC ではシリコンがよく使われる。)シリコンそのものは電気をほとんど通さないが、その結晶にシリコンより結合電子のひとつ多い原子(燐など)を不純物として混ぜることで結晶中の電子が動けるようにしたものを N 型半導体、逆に結合電子のひとつ少ない原子(ホウ素など)を不純物として混ぜることで電子の抜けた穴(正孔)が動けるようにしたものを P 型半導体という。
N 型半導体と P 型半導体を結合させると N から P へのみ電子は移動 = P から N へのみ電流が流れる素子ができる。これがダイオードで交流から直流を取り出すときなどに使われる。そして、薄い N 型半導体を P 型半導体で挟むと、一方の P と N の間に電流を流したとき電流にほぼ比例して P の間に大電流の流れる素子ができる。P と N を逆にすると電流の流れる向きが逆になり、これをトランジスタという。入力電流の小さな変動で大きな電流を制御できるので、アナログ回路での増幅器、デジタル回路では導通の有無によるスイッチング素子として使う。

上図のトランジスタでは電子と正孔の双方が電荷を運搬するキャリアとして働くバイポーラ(bipolar : 双極性)トランジスタという。これに対して中央の導通体へ薄い金属酸化膜越しに電圧をかけて制御する構造のものがあり、これは電子か正孔の一方だけがキャリアとなる MOS (Metal-Oxide Semiconductor)トランジスタという。バイポーラ型は高速だが消費電力が大きく、MOS 型は低速だが消費電力が少ないという特性がある。更に N 型と P 型の MOS トランジスタを組み合わせるとほとんど電流の流れない回路が構成でき、これを CMOS (Complementary MOS : 相補型 MOS)という。以前は CPU にバイポーラ、メモリに CMOS が多かったが、最近はほとんどが CMOS になっている。

メモリは内部のデータに位置指定だけでどこにでも直接アクセスできる性質があり、このことをランダムアクセス可能という。(ハードディスクもランダムアクセス可能だが速度的にメモリの方が格段に速い。またメモリには可動部分がないというメリットがある。)
メモリには大別して ROM (Read-Only Memory : 読み出し専用メモリ、不揮発性メモリと RAM (Random-Access Memory) とがある。ROM は電源を切っても内容の消えないタイプのもので、計算機では IPL や BIOS、周辺機器のファームウェア(ハードウェアと密接して動くソフトウェア。上位からはハードウェアの一部に見えるもの)などで使われる。ROM は RAM よりは低速で、製造時のマスキング工程で内容を書き込むマスク ROM、一度だけ内容を書き込める PROM (Programmable ROM)、チップ表面の窓に紫外線を当てることで内容を消去できる EPROM (Erasable PROM)、内容をブロック単位で電気的に消去できる EEPROM (Electrically EPROM)、EPROM の一種で内容を一括消去できるフラッシュメモリ(スマートメディアや CF など)などがある。
一方、RAM は任意番地にアクセスして内容を読み書きできるタイプのもので RAM は一般的に揮発性で電源を切ると内容は消えるが、不揮発性の NVRAM (Non-Volatile RAM)もある。RAM には 1 ビットの記憶素子をフリップフロップ(flip-flop、入力信号によって出力状態が 0 か 1 に切り替わり、入力信号がなくなっても状態を保持する回路。ひとつのフリップフロップで 1 ビットの情報が記憶できる)で実現する SRAM (Static RAM)と 1 つのトランジスタとキャパシタ(capacitor : 電荷を蓄える素子)で実現する DRAM (Dynamic RAM)とがある。SRAM は通電するだけでデータが保持されるが、DRAM はキャパシタから電荷が抜けるため定期的にデータを書き直す(リフレッシュする)必要がある。また、DRAM では電荷の取り出しでデータを読み出すことにより、読み出したデータは消えてしまうため(破壊読み出し)読み出し後にもリフレッシュが必要になる。SRAM は高速だが集積率を上げられないため CPU のキャッシュなどで主に使われ、低速だが集積率によりビットあたりの単価の安い DRAM がメインメモリなどに使われる。
そして、メモリを効果的に使うための仕組みとして MMU (メモリ管理ユニット)がある。MMU はメインメモリを数 KB 単位のページに分割して CPU から見た仮想メモリアドレスと物理メモリアドレスの対応をページテーブルによって管理する。(このアドレス変換により物理的には連続していないメモリ空間が CPU には連続したものとして見えるようになる。)このアドレス変換を補助記憶装置にまで広げたのが仮想記憶で、ハードディスクなどを仮想的なメモリとして利用することで実際の物理メモリ以上のメモリ空間を実現する。
ハードディスク
ハードディスクに代表される補助記憶装置は、まずランダムアクセス可能な直接アクセス方式(DASD :Direct Access Storage Device)と、先頭から順番にだけアクセス可能な順次アクセス方式(磁気テープ類。例えばオープンリール、コンパクトカセット、DAT、DDS など。主にデータの保管やバックアップで使われる)とに大別される。一方、装置の機構から見るとメディアが装置と一体であるハードディスクと、メディアの取り出し可能なリムーバブルディスク(MO、PD、CD-ROM、CD-R、DVD など)に分かれる。(一般にリムーバブルディスクの方が低速になる。)
ハードディスクは金属やガラスの円盤(プラッタ)に磁性体を塗布したもので、磁気ヘッドで読み書きを行う。プラッタと磁気ヘッドの組み合わせによって任意の場所へアクセスするかたちになっている。但し、それでも機械的な動作に要する時間によりハードディスクはメモリより著しく速度は遅くなる。そして、OS がハードディスクへランダムアクセスするためには、その領域を識別できなければならない。物理的にはプラッタ上のひとつの円周がトラックで、トラックは更にいくつかのセクタに分割されている。セクタは数百から数 KB の固定長で、読み書きはこのセクタ単位で行われる。(但し、これでは小さすぎるため、通常はセクタをいくつか集めたクラスタ単位で読み書きされる。)また、プラッタが複数ある場合の同一位置のトラックの集合をシリンダといい、シリンダ番号-ヘッド番号-セクタ番号の組み合わせによってセクタの識別が行われる。また、OS 側から扱いやすいように、パーティションによって論理的なドライブとして分割し、更にパーティション毎のファイルシステムを作成する。ファイルシステムはひとまとまりの領域をファイルとして名前を付け、ファイル名でハードディスク上の位置とサイズが得られるようにしたもののことで、木構造を取ることが多い。(これはディスク先頭のパーティションテーブルで管理される。)また、パーティションのファイルシステムの初期化のことを論理フォーマットという。
ハードディスクのアクセスを高速化する手段としてバッファリング、DMA とバスマスタリング、フラグメーションの解消などがある。まず、バッファリングはハードディスク側で数百 KB から数 MB のバッファを用意してバッファリングする方式のことを指す。また、DMA (Direct Memory Access) は制御バス上に DMA コントローラと呼ばれるデータ転送専用のプロセッサを置き、CPU を介さずにハードディスクとメモリの間で直接データ転送を行う。(このときの転送に使われるバスが DMA チャネル。)これをもう一歩進めたのがバスマスタリングで、CPU がバスマスタリングのコントローラに制御バスを明け渡すと、コントローラが一時的にバスマスタ(バスの所有者)になり、自分が CPU のようにふるまうことをいう。但し、バスマスタリングでは DMA チャネルが不要になるものの、転送中は CPU が制御バスを使えないという問題がある。そして、長時間使われたハードディスクで空き容量が断片化し、ファイルを構成するクラスタが飛び飛びになってしまうことをフラグメーションという。フラグメーションが起こるとアクセスなどに余計な時間がかかりバッファリングも効果が出にくくなるため、クラスタの内容を再配置し直すことをデフラグメーションという。OS などがそのためのユーティリティ・プログラムを持っていることが多い。
入出力
入出力装置も CPU から見れば、単なるデータを読み書きする相手に過ぎないが、そのタイミングが CPU とは無関係(非同期)に発生するところに特徴がある。CPU が行う入出力の方法は I/O アドレス方式と メモリマップト I/O に大別される。I/O アドレス方式(I/O マップト I/O)は入出力専用のアドレス空間を用意して、その領域経由でデータ転送などの行う方式をいう。これは専用の入出力命令を利用して I/O アドレス空間(I/O ポート)のアドレスをオペランドとして使う。周辺装置は互いが重複しないような I/O ポートが割り当てられており、特定の信号線によってメモリアクセスと I/O アクセスが区別される。I/O アドレス方式はメインメモリと異なるアドレス空間を使えるが、専用の命令が必要なため自由度が低くなる。Intel の x86 は I/O アドレス方式を使っている。
これに対し、メモリマップト I/O では入出力のアドレス空間をメインメモリと共有し、専用命令ではなく CPU の転送命令でアドレスを読み書きして入出力を行う。このため転送モードに応じたアドレッシングなど自由度が高くなり、過去では CPU のリソースが貴重だったことによるデメリットがあったものの、最近ではそれもなくなってきている。(モトローラの 68000 や RISC の多くなど。)
入出力では低速な周辺機器とのデータのやりとりを効率よく行うためにハードウェア割り込みを使う。(相手の準備ができているかどうかを定期的に問い合わせるポーリングもあるが、この場合、不要な問い合わせが発生する。)制御バスには CPU への割り込み信号線があり、これを経由して割り込み要求があると、CPU は処理を中断して割り込みベクタで指定された割り込みサービスルーチンにジャンプする。ハードウェア割り込みの方法は CPU によって異なるが、Intel の x86 では割り込み信号線が 1 本しかないので、外部の割り込みコントローラを使って識別する。割り込みは割り込み番号で識別されるが、割り込み番号には優先順位があり、優先度に応じて割り込みへの割り込みも行われる。
このように周辺機器の入出力を行うためのシステムリソースとして Intel x86 上の Windows では I/O ポート、IRQ (割り込み番号)、DMA チャネル、メインメモリを使っている。具体的な入出力装置としてキーボード(マトリックス上のスイッチが押されると対応したスキャンコードに変換される。スイッチが押されるとメーク信号、離されるとブレーク信号を生成して割り込みをかけ CPU はスキャンコードを読み出す。なお、同時にいくつのキー押下の検出できるかのことを n キーロールオーバという)、マウス(機械式マウスではボールに密着した回転軸が X と Y 方向にあり、ボールの回転に伴って切り欠きのあるふたつの円盤がフォトカプラの光軸を断続的に遮断して電気パルスを発生させ、ここから位置移動情報を作り出している。ここはよく分からなかった : 唯野注)、ディスプレイ(CRT(Cathode Ray Tube : ブラウン管)や液晶を用いた出力装置で CPU からの出力で、内部的には 2 次元画像情報を生成する部分と、画像情報を表示可能な電気的データに変換する箇所に分かれる。)、スキャナ、タブレット、タッチパネル、プリンタ、スピーカ、シリアルポート、パラレルポート、ネットワークインタフェースなどが挙げられる。
OS とデバイスドライバ
このような多様なハードウェアの管理を行うのが OS とその下請けとなるデバイスドライバになる。OS の存在によってユーザプログラムからはハードウェアが抽象化された統一的なインタフェース(システムコール)を利用でき、ハードウェア固有の操作から解放されるようになる。OS は中核となるカーネル、デバイスドライバ、ユーザインタフェースなどから成るが、カーネルは主に装置管理、プロセス(実行中プログラム)管理(CPU は同時にひとつのプロセスしか処理しないので、マルチタスク OS では CPU 外部のタイマによる割り込みによってプロセスを切り替えながら実行する)、ファイルシステム管理(UNIX ではハードウェア資源をファイルシステムに名前付けしたアクセスを提供している)といった機能を持つ。
デバイスドライバは周辺装置を制御するためのもので OS から呼び出されるモジュールというかたちを取る。周辺装置はそれぞれのデバイスドライバを持ち、OS の呼び出しによってハードウェアの違いを吸収し抽象的なインタフェースを提供する。デバイスドライバは OS よりも下層で動くので、ユーザプログラムとは動作が異なる。作業の多くは I/O 空間を通じて行われ CPU との同期もデバイスドライバの役割となる。
