ハードウエアやOSなどに依存しないソフトウエアを構成する方法として
すぐに思い浮かべることは基本的なデバイス操作をおこなう関数を
定義し、ハードウエアやOSなどからユーザプログラムを切り離すことである。
また、デバイス操作をOSのカーネルにデバイスドライバとして組み込み、
ユーザプログラムはOSが提供するシステムコールを利用することで
汎用性を確保することである。
図5はデバイス操作を抽象化する方法をいくつか示しています。
C言語を前提にしています。
図5:デバイス操作法
ユーザ関数でI/OのOSによる違いを隠蔽する方法(1)についてはじめに
説明します。これはKEK標準のCAMAC関数の1つです。CAM_Openは
CAMACの初期化を行なうユーザ用の関数です。一旦これを呼べば、
CAMAC関数でさまざまのCAMAC操作が可能になります。CAMAC関数は
N, A, FのCAMAC情報を特定CAMACモジュールに送ることでデータを
読み書きできます。どのようなOS、どのようなハードウエアを
持って来てもこれらの関数によってそれらの違いを隠蔽できます。
これは大変な利点であると同時に、違いを吸収するための余計な
プログラムコードを追加することでオーバーヘッドを増やし実行
性能という点では不利になります。
次はユーザ関数でI/OのOSによる違いを隠蔽する方法(2)を見てください。
この関数もKEK標準のVME関数の1つです。この関数を一度呼ぶと
VMEバス上の特定モジュールに直接、I/Oが可能になります。
手順を示します。次のカーネルを介さない方法を見てください。
vme_mapopen関数を呼ぶとあるアドレスが返って来ます。
VMEアドレスに対応する計算機上のアドレスです。仮想記憶を用いるOSでは
ユーザプログラムの仮想アドレスが返って来ます。また、すでに
VMEアドレスがユーザプログラムのアドレス空間から直接見える
仮想記憶を用いないOSではそのアドレスをそのまま使うことができます。
読み込みや書き込みは図のように簡単にできます。仮想記憶を用いるOSでの
このようなデバイスアクセス法は簡単で容易にでき、しかも
OSへの不正アクセスを防止できているので、よく用いられます。
しかし、割り込みやDMA(ダイレクトメモリアクセス)のような場合は
カーネル関数に依存する部分が生じてきますので、上記のようには
いきません。そこでカーネルを介してデバイスにアクセスする方法を
検討します。図の最後にopen関数があります。これはシステムコールの
1つです。デバイスファイルをオープンするという手順で、
デバイスアクセスに必要なファイルデスクリプタを獲得し、
それを使って、デバイスに読み書きします。read/writeシステムコールは
そのためのものです。データを格納するバッファと読み書きしたいデータの
サイズをバイト単位で指定することで簡単にできます。