Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxブロックデバイスドライバ

Linuxブロックデバイスドライバ

  
 

ブロック型デバイスはキャラクタ型デバイスと並んでいる概念で、Linuxではこれら2種類のデバイスの構造は大きく異なりますが、一般的に、ブロック型デバイスドライバはキャラクタ型デバイスドライバよりも入出力操作の面で複雑です。重要な違い、バッファリング、I /Oスケジューリング、リクエストキューなどはすべて、ブロックデバイスドライバに関連する概念です。この章では、Linuxブロックデバイスドライバのプログラミング方法について説明します。セクション13.1では、ブロックデバイスの入出力操作の特性を分析し、キャラクタデバイスとブロックデバイスの入出力操作の違いを比較します。セクション13.2では、Linuxブロックデバイスドライバ全体の構造を説明し、主なデータ構造、機能、および関係を分析します。セクション13.3〜13.5は、ブロックデバイスドライバモジュールのロードとアンロード、オープンと解放、およびioctl()関数をそれぞれ示しています。 13.6節は非常に重要です。ブロックデバイスのI /O操作が依存する要求キューの概念と使用法について説明しています。 13.2節と13.3節から13.6節は全体と部分の関係であり、13.2節から13.6節と13.7節は反復累進関係です。セクション13.1から13.6の内容に基づいて、セクション13.7はLinuxデバイスの読み書きプロセスを要約しています。セクション13.7にブロックデバイスドライバの具体的な例であるRAMDISKドライバを示します。 13.1デバイスのI /O操作特性キャラクタ型デバイスとブロック型デバイスのI /O操作の違いは、ブロック型デバイスは入出力をブロック単位でしか受け付けることができないのに対し、キャラクタ型デバイスはバイト単位であることです。バッファリングを必要とせず、固定ブロックサイズで動作しないため、ほとんどのデバイスはキャラクタ型デバイスです。 2つのブロックは、I /O要求用の対応するバッファを持っているので、どの順序に応答するかを選択できますキャラクタデバイスは、バッファして直接読み書きする必要はありません。読み取りと書き込みを調整する順序は、連続したセクターを別々のセクターより読み書きする方が速いため、ストレージデバイスにとって最適です。ブロックデバイスはランダムにアクセスすることができますが、3文字デバイスは連続して読み書きできます。ブロックデバイスはランダムにアクセス可能ですが、ディスクなどの機械デバイスでは、ブロックデバイスへのアクセスを順番に整理することでパフォーマンスを向上させることができます。図13.1に示すように、ディスク1、10、3、2に対する要求は、読み取りおよび書き込みパフォーマンスを向上させるために、1、2、3、10に対する要求に調整されます。 SDカードやRAMDISKなどのブロックデバイスの場合、機械的な理由はなく、そのような調整を行う必要はありません。図13.1ブロックデバイスI /O操作の順序の調整13.2 Linuxブロックデバイスドライバの構造13.2.1 block_device_operations構造ブロックデバイスドライバには、キャラクタデバイスドライバのfile_operations構造に似たblock_device_operations構造があります。これはブロックです。リスト13.1で定義されているように、デバイス操作のコレクション。リスト13.1 block_device_operations構造体1 struct block_device_operations2 {3 int(* open)(struct inode *、struct file *); //Open 4 int(* release)(struct inode *、struct file *); //release 5 int (* ioctl)(struct inode *、struct file *、unsigned、unsigned long); //ioctl6 long(* unlocked_ioctl)(struct file *、unsigned、unsigned long); 7 long(* compat_ioctl)(struct file *、unsigned) 、unsigned long); 8 int(* direct_access)(struct block_device *、sector_t、unsigned long *); 9 int(* media_changed)(struct gendisk *); //メディアは変更されましたか? 10 int(* revalidate_disk)(struct gendisk *); //メディアを有効にする11 int(* getgeo)(struct block_device *、struct hd_geometry *); //ドライブ情報を入力12 struct module * owner; //module owner 13その主なメンバ関数の以下の分析:?開いて解放するint(* open)(構造体inode * inode、構造体ファイル* filp); int(* release)(構造体inode * inode、構造体ファイル* filp)キャラクタ型デバイスドライバと同様に、デバイスの電源を入れたり切ったりすると呼び出されます。 IO制御int(* ioctl)(構造体inode * inode、構造体ファイル* filp、unsigned int cmd、unsigned long arg);上記の関数は、ioctl()システムコールの実装であり、ブロックデバイスには多数の標準要求が含まれます。これはLinuxブロックデバイスレイヤによって処理されるので、ほとんどのブロックデバイス駆動型ioctl()関数は非常に短いです。 •メディアの変更int(* media_changed)(struct gendisk * gd);は、ドライブ内のメディアが変更されたかどうかを確認するためにカーネルによって呼び出され、変更された場合はゼロ以外の値を返し、それ以外の場合は0を返します。この機能はリムーバブルメディアをサポートするドライブでのみ利用可能で(非モバイルデバイスはこのメソッドを実装する必要はありません)、通常メディア状態が変化したかどうかを示すためにフラグ変数が必要です。 •メディアを有効にするint(* revalidate_disk)(struct gendisk * gd); revalidate_disk()関数はメディアの変更に応答するために呼び出され、これはドライバに新しいメディアを準備するために必要な作業をする機会を与えます。ドライブ情報を取得するint(* getgeo)(struct block_device *、struct hd_geometry *);この関数は、ドライブのジオメトリに基づいてhd_geometry構造体を埋めますhd_geometry構造体には、ヘッド、セクタ、シリンダなどの情報が含まれます。 •モジュールポインタstruct module * owner;通常はTHIS_MODULEに初期化されている、構造体を所有するモジュールへのポインタ。 13.2.2 gendiskの構造Linuxカーネルでは、gendisk(一般的なディスク)構造を使用して別のディスクデバイス(またはパーティション)を表しており、その構造はリスト13.2のように定義されています。リスト13.2 gendiskの構造体1 struct gendisk2 {3 int major; /*メインデバイス番号* /4 int first_minor; /*最初のサブデバイス番号* /5 int minors; /*サブデバイスの最大数(分割されていない場合) 、は1 * /6 char disk_name [32]; /*デバイス名* /7 struct hd_struct ** part; /*ディスク上のパーティション情報* /8 struct block_device_operations * fops; /*ブロックデバイス操作構造体* /9 struct request_queue * queue; /* request queue * /10 void * private_data; /*プライベートデータ* /11 sector_t capacity; /*セクタ番号、1セクタあたり512バイト* /12 13 intフラグ; 14 char Devfs_name [64]; 15 int number; 16 struct device * driverfs_dev; 17 struct kobject kobj; 18 19 struct timer_rand_state * random; 20 intポリシー; 21 22 atomic_t sync_io; /* RAID * /23符号なしロングスタンプ; 24 int in_flight; 25 #ifdef CONFIG_SMP26 struct disk_stats * dkstats; 27#else28 struct disk_stats dkstats; 29#endif30};メジャー、first_minorおよびマイナーは一緒になってディスクのプライマリおよびセカンダリデバイス番号を表し、同じディスクの各メジャーパーティションはメジャーデバイス番号を共有します。マイナーデバイス番号が異なります。 Fopsはblock_device_operationsで、前のセクションで説明した一連のブロックデバイス操作です。キューは、カーネルがこのデバイスのI /O要求キューを管理するために使用するポインタです。容量は、512バイト単位でデバイスの容量を示します。 Private_dataは、キャラクタ型デバイスドライバファイル構造のprivate_dataと同様に、ディスク上のプライベートデータを指すために使用できます。

Copyright © Windowsの知識 All Rights Reserved