このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。
ブロック・デバイス・ドライバがサポートするデバイスは、可変長ではなく固定長データを処理し、物理的にアドレス可能なストレージ・メディアにアクセスします(またはファイル・システム・アクセスをサポートします)。 一般的なブロック・デバイスには、ハードディスクやフラッシュ・メモリーがあります。
ブロック・デバイス・ドライバの実装は、LinuxとUNIXオペレーティング・システム間において様々な点で異なる場合があり、相違点のほとんどは、ドライバがブロック・リクエストの処理に使用する関数、ioctl()
メソッドのかわりにgetgeo()
(ジオメトリの取得)メソッドを優先的に使用したパーティション化ツールのサポート、およびカーネル・ブロック・デバイス・インタフェース(blkdev
)を使用したブロックI/O操作の処理に関するものです。 UNIXのブロック・デバイス・ドライバがデバイスとの間でデータの読取り/書込みを処理するために使用する
ルーチンは、Linuxシステムではdriver_
strategy()
と呼ばれます。
driver_
request()
<linux/blkdev.h>
に定義されたブロック・デバイスのblock_device_operations
構造体には一連のメソッド・ポインタが含まれ、それによりシステムがopen()
、ioctl()
などのシステム・コールを使用するときに、/dev
の下にあるデバイス・ファイル経由でデバイスとやり取りする方法が指定されます。
struct block_device_operations { int (*open) (struct block_device *, fmode_t); int (*release) (struct gendisk *, fmode_t); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*direct_access) (struct block_device *, sector_t, void **, unsigned long *); unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing); /* ->media_changed() is DEPRECATED, use ->check_events() instead */ int (*media_changed) (struct gendisk *); void (*unlock_native_capacity) (struct gendisk *); int (*revalidate_disk) (struct gendisk *); int (*getgeo)(struct block_device *, struct hd_geometry *); /* this callback is with swap_lock and sometimes page table lock held */ void (*swap_slot_free_notify) (struct block_device *, unsigned long); struct module *owner; };
単純なブロック・デバイス・ドライバであれば、次のように、この構造体に定義されたメソッドのサブセットを実装するだけで作成できる場合があります。
struct block_device_operationsdriver_blkdevops
= { .owner = THIS_MODULE, .open =driver_open
, .release =driver_release
, .ioctl =driver_ioctl
, .getgeo =driver_getgeo
, };
などのドライバ・メソッドの他に、ドライバのロード/アンロード時にコールされるドライバ用のdriver_
request()module_init()
初期化ルーチンとmodule_exit()
クリーンアップ・ルーチンを定義するのが一般的です。 これらのルーチンはregister_blkdev()
およびunregister_blkdev()
をコールして、ドライバのデバイス・メジャー番号を登録/登録解除し、alloc_gendisk()
およびdel_gendisk()
をコールして、汎用ディスク(gendisk
)デバイスのカーネル表現を割当て/削除します。 システムでディスクを使用できるようにするため、通常は初期化ルーチンでadd_disk()
を最終アクションとしてコールします。