read
関数を作成する前に、前回に実装したdio_open
と
dio_release
の中でリソース情報の登録と解除を行う処理を追加する。
情報システム実験(6)テキストの2頁におけるDIO_RESOURCE
構造体の各
フィールドはio_address[6]
、io_size[6]
、irq
であり、
ここにリソース情報を格納することになっていたことを確認すること。
ここに格納されるI/Oポートや割り込みなどのリソース情報の所在を登録する
ためにprivate_data
を使う。
このprivate_data
は、<linux/fs.h>
のfile構造体(struct file
)おけるフィールドの一つである。
このprivate_data
にディジタルI/Oリソース(DIO_RESOURCE
)型の
dio_res
を登録することにする。
そのためには、次のような二つの宣言文と一つの代入文があればよい。
これにより、filp->private_data
にはI/Oポートや割り込み番号などのリ
ソース情報を指すポインタアドレスを登録できる。
この処理を前回の実験で作成したdio_open
関数に付加する。
なお、二つの宣言文のうちDIO_RESOURCE dio_res;
は前の実験のドライバ作成時に
すでにグローバル変数として宣言してある。もう一つのstruct file *filp;
も、
すでにdio_open
関数の引数として宣言してある。そこで、新しい
dio_open
関数は次のようになる。
closeシステムコールに対応するreleaseメソッドでは、
open
メソッドが割り当てたものを全て解放できるようにする。
そのためには、dio_release
関数においてprivate_data
にNULL
ポ
インタを代入すればよい。
ヌルポインタとは、どのオブジェクトも指していないポインタである。
そこで、新しいdio_release
関数は、次のようになる。
<linux/fs.h>
のstruct file
におけるprivate_data
は、
void *
型で定義される次のようなポインタ変数である。この領域は、
ドライバ側で自由に使用してよい領域とされており、ここではデバイスのリソー
ス情報を他のシステムコール内でも使用するために、この領域を使用して情報を
登録することにした。
このfile
構造体はファイル毎(デバイスドライバの場合はスペシャルファ
イルとしてのデバイスノード毎)に共有されるため、一つのデバイスドライバで
複数のデバイスを制御する場合に、それぞれ個別に必要なリソースや識別子など
を関連付ける必要がある場合に有用となる。