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構造体はファイル毎(デバイスドライバの場合はスペシャルファ
イルとしてのデバイスノード毎)に共有されるため、一つのデバイスドライバで
複数のデバイスを制御する場合に、それぞれ個別に必要なリソースや識別子など
を関連付ける必要がある場合に有用となる。