Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
デバイスファイル自体は各ファイルシステム上の通常のファイルとして存在する。単にファイルタイプがデバイスファイルを示していることと、属性としてデバイス番号を持っているだけである。
ブロックデバイスファイルをオープンすると、各ファイルシステム(ext2など)はメモリiノードの初期化時(read_inode関数)に、ブロックデバイスファイル共通のファイル操作関数テーブルdef_blk_fopsをファイル構造体に登録する。
また、iノードにはブロックデバイス管理構造体(struct block_device)とリンクする。さらにこのブロックデバイス管理構造体(struct block_device)には、先にブロック型デバイスドライバ登録(register_blkdev関数)時に指定したデバイス操作テーブル(block_device_operations構造体、blkdevs[]に登録されている)を登録する(init_special_inode関数)。登録後、本当のデバイスのオープン関数を呼びなおす。(図ではbaa_open関数)
その後のデバイスへのアクセスは全て新しく登録しなおしたデバイス操作関数テーブルを通して行われる。
ブロックデバイスでは通常、read/write/fsync処理関数としてそれぞれ block_read, block_write, block_fsyncがファイル操作テーブルに登録されている。これらの関数は、バッファキャッシュ経由のread/writeとして動作する。バッファキャッシュ管理から上記ブロック I/Oインターフェイスを通して、再度デバイスドライバが呼び出される。
ブロックデバイス特有の機能はデバイス操作関数テーブルに登録されている。デバイスのioctlや、リムーバル可能なデバイスに対する操作などが登録されている。(ドライバの各種テーブルもここのデバイス操作関数テーブルに統合した方が美しいと思われる)
キャラクタ型デバイスの場合も同様である。キャラクタ型デバイスファイルのiノード生成時にiノードにキャラクタデバイスファイル共通の仮のファイル操作テーブルとして、(ファイル構造体に)デバイス操作関数テーブルdef_chr_fopsが登録される。
その後、この操作関数テーブルを通して呼びだされる、仮のキャラクタデバイスオープン関数chrdev_open関数が、ドライバ登録テーブルchrdevs[]を参照しそのデバイスのデバイス操作関数テーブルに登録しなおす。登録後、そのデバイス操作関数テーブルを通してデバイスへのアクセスが行われる。
補足
Linuxのブロックデバイスアクセスは必ずバッファキャッシュ経由となる。伝統的UNIXのようなRAWデバイスアクセスを行うためには、特別なrawアクセス専用デバイスにバインドすることにより実現する。
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:18:03, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members