20

カーネル空間との通信方法を確認するために、ioctl サンプル プログラムを調べていました。プログラムでは WRITE_IOCTL がコマンドとして使用されます

#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")

が何であるか理解できません_IOW(MY_MACIG, 1, int)。これは、プログラムをダウンロードした場所からのリンクです。私を助けてください。 http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html

4

2 に答える 2

16

ご存じかもしれませんが、ioctl は、Linux Device Drivers book で説明されているように一意である必要があります。

ioctl コマンド番号は、正しいコマンドを間違ったデバイスに発行することによって引き起こされるエラーを防ぐために、システム全体で一意である必要があります。 FIFO やオーディオ デバイスなどのシリアル ポート入力ストリーム。各 ioctl 番号が一意である場合、アプリケーションは、意図しない処理に成功するのではなく、EINVAL エラーを受け取ります。

さらに、ioctl は、カーネル空間へのデータの書き込みおよび/またはカーネル空間からのデータの読み取りを要求できます。

ioctl を実行する独自のドライバーを作成する場合、ioctl コマンドでこれらすべてを記述する必要があります。

_IO、_IOW、_IOR、_IORW は、一意の ioctl 識別子を作成し、必要な R/W に必要な機能 (方向) を追加するヘル​​パー マクロです。

これらは、次のパラメーターを取ることができます: マジック番号、コマンド ID、および渡されるデータ型 (存在する場合)。

マジック ナンバーは、LDD の本の引用で言及されているようなエラーをドライバーが検出できるようにする一意の番号です。

コマンド ID は、どのコマンドを呼び出す必要があるかをドライバーが理解する方法です。

最後のパラメーター (タイプ) により、カーネルはコピーされるサイズを理解できます。

お役に立てれば。

PS: 詳細については、Linux Device Drivers book (第 6 章) https://lwn.net/images/pdf/LDD3/ch06.pdfを参照してください。

于 2014-03-26T10:38:43.830 に答える
12

http://www.circlemud.org/jelson/software/fusd/docs/node31.htmlから:

Linux ヘッダー ファイル/usr/include/asm/ioctl.hは、ioctl コマンド番号を作成するために使用する必要があるマクロを定義します。これらのマクロは、3 つの引数のさまざまな組み合わせを取ります。

  • type、デバイス ドライバーに固有のものとして選択された 8 ビット整数。タイプは、同じファイル記述子を「リッスン」している他のドライバと衝突しないように選択する必要があります。(たとえば、カーネル内では、ソケット ファイル記述子に送信された ioctl が両方のスタックによって検査される可能性があるため、TCP スタックと IP スタックは異なる番号を使用します。)
  • number、8 ビット整数のコマンド番号。ドライバー内では、ドライバーがサービスするさまざまな種類の ioctl コマンドごとに個別の番号を選択する必要があります。
  • data_type、クライアントとドライバーの間で交換されるバイト数を計算するために使用される型の名前。この引数は、たとえば、構造体の名前です。

コマンド番号の生成に使用されるマクロは次のとおりです。

  • _IO(int type, int number)、型と数値のみを送信し、(整数) retval のみを受信する単純な ioctl に使用されます。
  • _IOR(int type, int number, data_type)は、デバイス ドライバーからデータを読み取る ioctl に使用されます。ドライバーは sizeof(data_type) バイトをユーザーに返すことができます
  • _IOW(int type, int number, data_type)、_IOR に似ていますが、ドライバーにデータを書き込むために使用されます
  • _IORW(int type, int number, data_type)、_IOR と _IOW の組み合わせ。つまり、データはドライバーに書き込まれ、クライアントによってドライバーから読み戻されます。
于 2016-11-07T12:26:37.537 に答える