cmd=3222823425
Linuxカーネルでは、このコマンドが実際に何を意味するのかを理解するために、値をさまざまな部分に分割する方法が混乱しています。一部の関数では、次のパラメータを使用してコマンドを発行することがわかりますが、これらのioctl
パラメータ値の意味を知りたいと思います。
fd=21, cmd=3222823425 and arg=3203118816
私はシステムコールcmd
のioctl
値が3222823425
。私はcmdがandで構成されたコマンド番号であることがわかりました。type
最初の2つは整数(0-255)です。 number
data_type
8-bit
それで、私の質問は、この呼び出しが何をしたいのかを判断するためにこれらのパラメータ値をどのようにデコードしますか?
答え1
ioctlはドライバに渡されるので、ioctlが何をしているのかを知るために最も重要なのは、どのドライバがそれを処理するのかです。
あなたが読んだのは、ドライバーの作成者がioctl番号を選択するときに使用する必要がある規則type
です。異なるドライバが同じ値を使用して完全に異なることを意味する可能性がありますが、ioctlが誤って誤ったデバイスに送信される場合は、致命的なイベントを発生させるよりもエラーを返す可能性が高くなることを避けるのが最善です。number
data_type
この本には、コンベンションの説明がよく記載されています。Linuxデバイスドライバ(LDD),第6章。実際にはdata_type
(2.6.xシリーズIIRCの初期から)2つの部分で構成されていますdirection
。size
type
(8ビット)は、ドライバに実装されているioctl間で一貫性を維持する必要がある定数であり、可能であれば関連していないデバイスのioctlとは異なる必要があります。古いtype
価値の店があります。Documentation/ioctl/ioctl-number.txt
。number
(8ビット)ドライバのすべてのioctlに対して異なる必要があります。direction
(2ビット)データ転送方向を示します(0 =なし、1 =書き込み、2 =読み取り、3 =すべて)。size
ioctl引数がデータバッファへのポインタである場合のデータバッファのサイズ。
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 somestruct
ioctlを処理するドライバが何であるかわからない場合は、カーネルソースコードから同様の呼び出しを検索して候補を収集できます。ただし、通常は#define FOOIO_TYPE 0x62
次のマクロを使用しているため、単純なテキスト検索ではドライバが見つからないことに注意してください#define FOOIO_SOMETHING _IOR(FOOIO_TYPE, 1, struct foobar)
。
ioctlが動作するファイル記述子に加えて、ioctl呼び出しには、ioctl numbercmd
と引数という2つのパラメータがありますarg
。このパラメーターは即値またはバッファーへのポインターです。ここで、ドライバーの作成者が規則に従う場合は、arg
アプリケーションのメモリースペース内の24バイトのバッファーへのポインターでなければなりません。