Linux 2.6.29のioctlでcmd = 3222823425をデコードする方法

Linux 2.6.29のioctlでcmd = 3222823425をデコードする方法

cmd=3222823425Linuxカーネルでは、このコマンドが実際に何を意味するのかを理解するために、値をさまざまな部分に分割する方法が混乱しています。一部の関数では、次のパラメータを使用してコマンドを発行することがわかりますが、これらのioctlパラメータ値の意味を知りたいと思います。

fd=21, cmd=3222823425 and arg=3203118816 

私はシステムコールcmdioctl値が3222823425。私はcmdがandで構成されたコマンド番号であることがわかりました。type最初の2つは整数(0-255)です。 numberdata_type8-bit

それで、私の質問は、この呼び出しが何をしたいのかを判断するためにこれらのパラメータ値をどのようにデコードしますか?

ベストアンサー1

ioctlはドライバに渡されるので、ioctlが何をしているのかを知るために最も重要なのは、どのドライバがそれを処理するのかです。

あなたが読んだのは、ドライバーの作成者がioctl番号を選択するときに使用する必要がある規則typeです。異なるドライバが同じ値を使用して完全に異なることを意味する可能性がありますが、ioctlが誤って誤ったデバイスに送信される場合は、致命的なイベントを発生させるよりもエラーを返す可能性が高くなることを避けるのが最善です。numberdata_type

この本には、コンベンションの説明がよく記載されています。Linuxデバイスドライバ(LDD),第6章。実際にはdata_type(2.6.xシリーズIIRCの初期から)2つの部分で構成されていますdirectionsize

  • type(8ビット)は、ドライバに実装されているioctl間で一貫性を維持する必要がある定数であり、可能であれば関連していないデバイスのioctlとは異なる必要があります。古いtype価値の店があります。Documentation/ioctl/ioctl-number.txt
  • number(8ビット)ドライバのすべてのioctlに対して異なる必要があります。
  • direction(2ビット)データ転送方向を示します(0 =なし、1 =書き込み、2 =読み取り、3 =すべて)。
  • sizeioctl引数がデータバッファへのポインタである場合のデータバッファのサイズ。

ioctl番号は次のようになります。

 direction << 30 | size << 16 | type << 8 | number

(ドライバを作成する場合は、_IOC_*次に定義されているマクロを使用してください。)asm-generic/ioctl.h.)

ioctl番号3222823425 = 0xc0186201の場合、タイプ= 0x62(1999年には「bit3 vmeホストブリッジ」と呼ばれる)、番号= 1、方向= 2、およびサイズ= 0x18 = 24を取得するため、ioctlは24バイトの入力パラメータを使用します。

ioctl値は、24バイト構造_IOR(0x62, 0x01, struct somestruct)または類似の構造として定義する必要があります_IOR('b', 1, struct somestruct)struct somestructioctlを処理するドライバが何であるかわからない場合は、カーネルソースコードから同様の呼び出しを検索して候補を収集できます。ただし、通常は#define FOOIO_TYPE 0x62次のマクロを使用しているため、単純なテキスト検索ではドライバが見つからないことに注意してください#define FOOIO_SOMETHING _IOR(FOOIO_TYPE, 1, struct foobar)

ioctlが動作するファイル記述子に加えて、ioctl呼び出しには、ioctl numbercmdと引数という2つのパラメータがありますarg。このパラメーターは即値またはバッファーへのポインターです。ここで、ドライバーの作成者が規則に従う場合は、argアプリケーションのメモリースペース内の24バイトのバッファーへのポインターでなければなりません。

おすすめ記事