宇宙ドーナツ研究会

セキュリティ系お勉強メモ

キャラクタ型デバイスのデータ構造

https://linux-kernel-labs.github.io/master/labs/device_drivers.html
ここの翻訳。

キャラクタ型デバイスは、struct dev で表される。 これを操作するドライバが使う主要な構造体は、以下の3つ。

  • struct file_operations
  • struct file
  • struct inode

file_operations 構造体

inode構造体とfile構造体

inode 構造体は、ファイルシステムから見たファイルの表現で、個々のファイルを一意に識別する。
サイズ、権限、アクセス時刻などの時刻情報などの情報を持つ。

file構造体もファイルを表現するが、よりユーザの視点に近い。
file構造体がもつ要素としては、 inode、ファイル名、ファイルの場所などがある。
全てのファイルは、openされると、file構造体に紐づけられるようになる。

file と inode の違いは、オブジェクト指向プログラミングを例えに出すとわかりやすい。
inodeがクラスだとすれば、files はオブジェクト(inodeクラスのインスタンス)となる。
inodeはファイルの静的イメージであり、fileは、そこから生成動的に生成されるファイルイメージといった具合だ。

これをデバイスドライバに当てはめると、
inodeは、操作対象となるデバイスのマイナー番号、メジャー番号を決定するために使われる。
そしてfileは、ファイルを実際にopenする時のフラグの決定や、
private_dataの記録やアクセスに使われる。

struct file の内容は、こんな感じ。

  • f_mode
    • READやWRITEなど
  • f_flags
    • open時のフラグ(O_RDONLY, O_NONBLOCK など)
  • private_data
  • f_pos
    • ファイルにおけるオフセット

inode構造体は、いろいろな情報の他に、i_cdevフィールドを持つ。
これは、キャラクタ型デバイスをへのポインタ(注1)。

注1:struct cdev *i_cdev ということ。

実装

デバイスドライバを実装するには、デバイスの情報を含めた構造体と、
ドライバ内でしようする情報を保持するための構造体を作ると便利。
そのため、キャラクターデバイスのドライバにおいては、
この構造体は、cdev構造体を参照させるようにしておきたい。