next up previous
次へ: dio_write関数の登録 上へ: システムコールの実装(その3: dio_write) 戻る: writeシステムコール

dio_write関数の作成

1バイトから4バイトまでのデータをwriteできる関数を考える。

このdio_write関数の各機能を次のように作成していく。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}ssize_t dio_write(struct fil...
... pdio_res = (PDIO_RESOURCE)filp->private_data;\end{verbatim}
\end{boxedminipage}

dio_read関数の時と同じように、まずリソース情報をfile構造体からとりだ す。



\begin{boxedminipage}{\textwidth}
\begin{verbatim}if (count < 0)
return -EINVAL;if (count > 4)
count = 4;\end{verbatim}
\end{boxedminipage}

次に、書き込みデータサイズの確認と設定を行なう。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}if (copy_from_user(bdata, buff, count))
return -EFAULT;\end{verbatim}
\end{boxedminipage}

dio_read関数の時とは逆に、ユーザ空間内のデータをカーネル空間にコ ピーする必要があるので、copy_from_user関数を使う。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}
for (i = 0; i < count; i+...
..._res->io_address[0] + i);
}return count;
}\end{verbatim}
\end{boxedminipage}

最後に、先ほど取り出したI/Oポートアドレスを介して、outb関数を使っ てデータの書き込みを行ない、書き込み完了後、書き込んだデータサイズを戻り 値としてdio_write関数を終了する。

以上の処理を全て使えば、1バイトから4バイトまでを出力できる dio_write関数が作成できる。



MANOME Yoichi 平成18年12月26日