ご存じかもしれませんが、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を参照してください。