Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
デバイスファイル自体は各ファイルシステム上の通常のファイルとして存在する。単にファイルタイプがデバイスファイルを示していることと、属性としてデバイス番号を持っているだけである。
ブロックデバイスファイルをオープンすると、各ファイルシステム(ext2fsなど)はメモリiノードの初期化時(read_inode関数)に、ブロックデバイスファイル共通の仮のiノード操作関数テーブルblkdev_inode_operationsをiノードに登録、ファイル操作関数テーブルdef_blk_fopsをファイル構造体に登録する。
その後、vfsはこの操作関数テーブルを通して、仮のブロックデバイスオープン関数blkdev_open関数を呼び出す。
blkdev_open関数は、デバイス番号をインデックスとしてドライバ登録テーブルblkdev[]を検索(get_fops関数)し、目的のデバイスドライバ固有のiノード操作関数テーブル、デバイス操作関数テーブルを見つけ出し、これを登録し直す。登録後、本当のデバイスのオープン関数を呼びなおす。(図ではxxx_open関数)
その後のデバイスへのアクセスは全て新しく登録しなおしたデバイス操作関数テーブルを通して行われる。
ブロックデバイスでは通常、read/write/fsync処理関数としてそれぞれ block_read, block_write, block_fsyncを登録する。これらの関数は、バッファキャッシュ経由のread/writeとして動作する。バッファキャッシュ管理から上記ブロック I/Oインターフェイスを通して、再度デバイスドライバが呼び出される。
キャラクタ型デバイスの場合も同様である。キャラクタ型デバイスファイルのiノード生成時にiノードにキャラクタデバイスファイル共通の仮のiノード操作関数テーブルchrdev_inode_operationsが、ファイル構造体にデバイス操作関数テーブルdef_chr_fopsが登録される。
その後、この操作関数テーブルを通して呼びだされる、仮のキャラクタデバイスオープン関数chrdev_open関数が、ドライバ登録テーブルchrkdev[]を参照しそのデバイスのデバイス操作関数テーブルに登録しなおす。登録後、そのデバイス操作関数テーブルを通してデバイスへのアクセスが行われる。
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:45:50, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members