ユーザ空間用に作成したアプリケーションから、カーネル空間に展開したデバイ
スドライバにアクセスするためには、カーネルへのシステムコールを利用する。
デバイスアクセスに使用できるシステムコールには、次のようなものがある。
open
システムコール
close
システムコール
read
システムコール
write
システムコール
ioctl
システムコール
これらのシステムコールを実行したときに、カーネル空間のデバイスドライバで
は各システムコールに対応したメソッド(関数)を呼び出す。
呼び出されるメソッド(関数)は、情報システム実験(11)の「1.2 cdevイン
ターフェイス」の「キャラクタ型デバイスドライバの登録は次のように行う」で
cdev_init
関数を使ってデバイスドライバの登録する時に設定した
file_operations
構造体の各フィールドに対応づけられる。
構造体の中の各フィールドは、特定の操作を実装するドライバのメソッド(関数)
へのポインタである。サポートされていない操作の場合は、NULL
のまま
にしておく。
この構造体のNULL
で指定していた部分を、実際に処理を実行したいメソッ
ド(関数)のポインタで置き換えて、これをcdev_init
関数で対応づけるこ
とで、システムコールの実行時に任意の処理を呼び出せるようになる。
(注. owner
はメソッド(関数)のプレースホルダではないため、対応する
システムコールは存在しない。)
各システムコールとfile_operation
構造体のメンバとの対応は次のよう
になる。
open
システムコール:open
close
システムコール:release
read
システムコール:read
write
システムコール:write
ioctl
システムコール:ioctl
ユーザ空間のopen
システムコールはカーネル空間のopenメソッド
に対応する。同様にユーザ空間のclose
システムコールはカーネル空間の
releaseメソッドに対応する。