next up previous
次へ: readシステムコール 上へ: システムコールの実装(その2: dio_read) 戻る: システムコールの実装(その2: dio_read)

リソース情報の登録

read関数を作成する前に、前回に実装したdio_opendio_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を登録することにする。

そのためには、次のような二つの宣言文と一つの代入文があればよい。
\begin{boxedminipage}{7cm}
\begin{verbatim}DIO_RESOURCE dio_res;
struct file *filp;filp->private_data = \end{verbatim}
\end{boxedminipage}

これにより、filp->private_dataにはI/Oポートや割り込み番号などのリ ソース情報を指すポインタアドレスを登録できる。

この処理を前回の実験で作成したdio_open関数に付加する。

なお、二つの宣言文のうちDIO_RESOURCE dio_res;は前の実験のドライバ作成時に すでにグローバル変数として宣言してある。もう一つのstruct file *filp;も、 すでにdio_open関数の引数として宣言してある。そこで、新しい dio_open関数は次のようになる。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}int dio_open(struct inode *...
...a. \n'');
filp->private_data =
return 0;
}\end{verbatim}
\end{boxedminipage}

closeシステムコールに対応するreleaseメソッドでは、 openメソッドが割り当てたものを全て解放できるようにする。

そのためには、dio_release関数においてprivate_dataNULLポ インタを代入すればよい。 ヌルポインタとは、どのオブジェクトも指していないポインタである。 そこで、新しいdio_release関数は、次のようになる。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}int dio_release(struct inod...
...'');
filp->private_data = NULL;
return 0;
}\end{verbatim}
\end{boxedminipage}

<linux/fs.h>struct fileにおけるprivate_dataは、 void *型で定義される次のようなポインタ変数である。この領域は、 ドライバ側で自由に使用してよい領域とされており、ここではデバイスのリソー ス情報を他のシステムコール内でも使用するために、この領域を使用して情報を 登録することにした。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}struct file {
struct list_h...
...struct kiobuf *f_iobuf;
long f_iobuf_lock;
};\end{verbatim}
\end{boxedminipage}

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



MANOME Yoichi 平成18年12月26日