ファイル構造

  
< linux /fs.h>で定義された

構造ファイルは、デバイスドライバの中で2番目に重要なデータ構造です。 fileはユーザ空間プログラムのFILEポインタとは関係がないことに注意してください。 FILEはCライブラリで定義されており、カーネルコードには現れません。一方、構造体ファイルは、ユーザープログラムには現れないカーネル構造です。

ファイル構造は開いているファイルを表します。 (これはデバイスドライバに固有のものではありません。システム内で開かれている各ファイルには、カーネル空間に関連付けられたstructfileがあります)。これはオープン時にカーネルによって作成され、最後にクローズされるまでファイルを操作する関数に渡されます。ファイルのすべてのインスタンスが閉じられた後、カーネルはデータ構造を解放します。

カーネルのソースコードでは、構造体ファイルへのポインタはしばしばファイルまたはfilp("ファイルポインタ")と呼ばれます。構造自体との混同を避けるために、常にこのポインタをfilpと呼びます。したがって、fileは構造体を参照し、filp​​は構造体ポインタです。

structファイルの最も重要なメンバーはここに示されています。

1.mode_t f_mode;

ファイルモードは、FMODE_READビットとFMODE_WRITEビットによって、ファイルが読み取り可能か書き込み可能(またはその両方)かを決定します。 ioctl関数はこのメンバの読み書き許可をチェックしますが、カーネルはあなたのメソッドを呼び出す前にチェックするので読み書き許可をチェックする必要はありません。その種類のアクセス用にファイルが開かれていない場合、読み書きの試みは拒否され、ドライバはこれについても知りません。

2.loff_t f_pos;

現在の読み書き位置。 Loff_tはすべてのプラットフォームで64ビットです(gcc用語ではlong long)。ファイル内の現在位置を知る必要がある場合、ドライバはこの値を読むことができますが、通常は変更しないでください;読み書きは、filp​​->に直接作用するのではなく、最後に受け取ったポインタを使って位置を更新します。; f_posこの規則の例外は、ファイルの場所を変更するように設計されているllseekメソッドです。

3.unsigned int f_flags;

これらはO_RDONLY、O_NONBLOCK、O_SYNCなどのファイルフラグで、ドライバが非ブロック操作を要求しているかどうかを確認するためにO_NONBLOCKフラグをチェックする必要があります。 。特に、f_flagsではなくf_modeを使用して、読み取り/書き込み権限を確認する必要があります。

4.struct file_operations * f_op;

ファイルに関連する操作。カーネルは、オープン実装の一部としてポインタを配置してから、操作をディスパッチする必要があるときにそれを読み取ります。 filp-> f_opの値はカーネルによって後方参照として保存されることはありません;これはあなたがあなたのファイルに関連するファイル操作を変更することができることを意味し、新しいメソッドはあなたが呼び出し側に戻った後はうまくいくでしょう。たとえば、メジャー番号1(/dev /null、/dev /zeroなど)に関連付けられたオープンコードは、オープンマイナー番号に基づいてfilp-> f_opの操作を置き換えます。この方法では、各システムコールにオーバーヘッドを招くことなく、同じメジャー番号でいくつかの動作を実装できます。ファイル操作を置き換える機能は、

オブジェクトプログラミングの「メソッドオーバーロード」のカーネルピアです。

5.void * private_data;

openシステムコールは、ドライバのopenメソッドを呼び出す前に、このポインタをNULLに設定します。このメンバーは自由に使用することも無視することもできます;割り当てられたデータを指すためにこのメンバーを使用することはできますが、カーネルがファイル構造を破壊する前にreleaseメソッドでそのメモリを解放することを忘れないでください。 Private_dataは、システムコール間で状態情報を保持する便利なリソースです。システムコールは、ほとんどのサンプルモジュールで使用されています。

6.struct dentry * f_dentry;

ファイルに関連付けられているディレクトリエントリ(dentry)構造体。デバイスドライバの作成者は通常、denp構造体を気にする必要はありませんが、filp​​-> f_dentry-> d_inodeとしてiノード構造体にアクセスする点が異なります。

実際の構造体にはいくつかのメンバがありますが、それらはデバイスドライバには役立ちません。ドライバはファイル構造を作成することはなく、実際には他の場所で作成された構造にアクセスするため、これらのメンバは無視しても問題ありません。

Copyright © Windowsの知識 All Rights Reserved