1

このリンクhttp://stackoverflow.com/questions/8922102/adding-new-ioctls-into-kernel-number-rangeを参照して、使用されていない場合は、方向を ioctl 番号にエンコードすることが必須であることがわかりましたcopy-to-user/copy-from-user

エンコードされた方向を設定して新しい ioctl 番号に到達する方法を誰かが説明してください。

4

1 に答える 1

1

_IO() シリーズのマクロと、公式の ioctl-number documentation に記載されているガイドラインを使用する必要があります。_IO マクロは ioctl.h で宣言されています。ほとんどは、型を表すために 8 ビットの int を取り、ioctl 番号を表すために 8 ビットの int を取り、データを IOCTL 呼び出しに渡す場合はデータ型を取ります。理想的には、タイプはドライバーに固有のものですが、ほとんどの番号は既に割り当てられているため、これを行うのは困難です。ioctl 番号は、他の番号と区別するためのものであり、順番に割り当てることができます。

詳細については、LDD3 の第 6 章を参照してください。


編集:あなたのコメントは、あなたが難しい例を必要としていると私に信じさせます。16 進数値で IOCTL 番号を参照しないでください。代わりに、次のように _IO() マクロを使用します。

// The type for all of my IOCTL calls.
// This number is from 0 to 255.
// Does not conflict with any number assignments in ioctl-number.txt.
#define MYIOC_TYPE 0xA4

// This ioctl takes no arguments.  It does something in the driver
// without passing data back and forth.  The ioctl number is from 0 to 255.
#define MYIOC_DOFOO _IO(MYIOC_TYPE, 0x00)

// This ioctl reads an integer value from the driver.
#define MYIOC_GETFOO _IOR(MYIOC_TYPE, 0x01, int)

// This ioctl writes an integer value from the driver.
#define MYIOC_SETFOO _IOW(MYIOC_TYPE, 0x02, int)

// This ioctl is confusing and is probably to be avoided.
// It writes a value to the driver while at the same time
// retrieves a value in the same pointer.
#define MYIOC_SETANDGETFOO _IOWR(MYIOC_TYPE, 0x03, int)

マクロは、データを ioctl 番号にエンコードします。したがって、単一の 16 進数を参照する代わりに、ioctl のタイプと番号を参照する方がはるかに適切です。これらのマクロには、データが行き来する方向と、そのデータのタイプが何であるかを文書化するという追加の利点があります。

詳細については、LDD3 の第 6 章を参照してください。

于 2013-07-05T06:15:56.447 に答える