UNIXシステムと入出力操作

UNIXカーネルはユーザプロセスの生成やその実行スケジューリング、 システムコール(システム関数)のサービス、ハードウエア割り込みなどの処理を一 手に引受て、ユーザからこれらの厄介な処理を解放してくれます。ユーザプログラムは 入出力操作用のシステムコールでVMEやCAMACの入出力を行なうのが一般的な入出力 方法です。但し、入出力の方法はこれ以外にもあり、特に直接入出力装置にある メモリやレジスタをユーザレベルで操作したいとの要求には 一般的な入出力方法ではなくマップ方式の入出力方法を用います。
VMEやCAMACに対して何らかの操作を行なうには、まずその抽象化されたデバイスを openシステム関数を用いてオープンする。抽象化されたデバイスは、 例えば、/dev/ccというようなデバイスファイルとして表現されます。 これはあたかもUNIXの通常のファイルと同じように扱われています。 このファイルにはMajor番号が必ず付きます。この番号がカーネルの中で デバイスドライバを対応させる重要な番号になります。 実際の入出力操作にはデータを読み込むためのread関数やデータを 書き込むためのwrite関数や大量なデータの入出力をともなわな い場合に使用するioctl関数を用います。処理を終えたらclose関数を呼びます。 これらの関数はカーネルの一部にデバイスドライバのコードの一部として 実装されています。それらの関数が呼び出されると処理はカーネルに入りその中で デバイスドライバが呼び出されます。 デバイスドライバはそれらの関数に対応するエントリーを 持っています。例えばCAMACデバイスドライバの場合、openシステム関数が呼ばれる と、そのエントリーであるccopenが呼ばれます。 ユーザプログラムがドライバに渡したい パラメータやデータ、CAMACモジュールから読みだしたデータやステータス情報を ユーザプログラムに返す方法はいくつか用意されています。 最も簡単な方法はioctl関数を 使う方法です。ioctl関数のパラメータを指し示すポインタがそのままドライバエント リーccioctlに渡されるので、そのポインタに向かってパラメータやデータの入出力を行 なえばよいのです。 read関数やwrite関数は大量のデータを入出力するのに向いています。またDMA操 作を行なうのに必要ないくつかのデータ構造のポインタを用意してくれるので、 DMA操作を行なうためには便利で、必要な方法です。 デバイスドライバの内部だけにしか使用することができない関 数の中にユーザプログラム上にあるデータをカーネルからコピーする関数があるので カーネル領域とユーザプログラムのデータ領域間のデータ移動に使われます。 DMA操作を伴うデータ移動の方法はこれらとは全く異なった方法で行なわます。 詳しくは別な章で扱います。
マップ方式の入出力方法は前述の入出力法と異なってread関数やwrite関数やioctl関数 を用いません。代わって、mmap関数をユーザプログラムから呼び出します。 この関数はデバイスをオープンしてそのデバイスに対してmmap関数を発行すると、 そのデバイスを操 作に必要なアドレスが返ってきます。ユーザプログラムレベルでそのアドレスをC言語の ポインタとして用い、直接デバイスのコントロールステータスレジスタなど をアクセスすることが可能となります。ただし、この方法ではDMA操作を行なうことはで きません。 C言語を用いたマップ方式の入出力操作法について簡単に触れます。