1

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

fd=21, cmd=3222823425 and arg=3203118816 

cmd私はさまざまなフォーラム、マニュアルページ、およびその他のリンクを調べて、ioctlシステムコールのがの値を持っている場合にそれが何を意味するのかを理解しています3222823425。cmdは、で構成されるコマンド番号であり、最初の2つは整数(0〜255)であることがtypeわかりnumberましdata_type8-bit

だから私の質問は、この呼び出しが何をしようとしているのかを見つけるためにこれらのパラメータ値をデコードする方法ですか?

4

2 に答える 2

4

ioctlコマンドをデコードする方法を理解するには、適切なドキュメントを参照するように注意してください。新しいDocumentation/ioctl-number.txtioctlコードを作成する方法を説明しますが、前の回答でリンクされているドキュメントは、ioctlの作成にも焦点を当てる前のプロセス全体の概要を示しています。ioctlの実際のマスキングはアーキテクチャによって異なる可能性があるため、より適切なソースですが、一般的な規則とビットフィールドの意味と位置の説明は、とにあります。asm/ioctl.hinclude/asm-generic/ioctl.hDocumentation/ioctl-decoding.txt


後者から:


 bits     meaning
 31-30     00 - no parameters: uses _IO macro
           10 - read: _IOR
           01 - write: _IOW
           11 - read/write: _IOWR

 29-16  size of arguments

 15-8   ascii character supposedly
        unique to each driver

 7-0    function #



上記によると、cmd = 3222823425は次のようにデコードする必要があります:

3222823425-> 0xC0186201-> 11000000000110000110001000000001

- `direction`   ->  `11`              ->  read/write;
- `size`        ->  `00000000011000`  ->  24 bytes (a pointer to a struct of
                                          this size should  be passed as 3rd
                                          argument of ioctl();
- `type`        ->  `01100010`        ->  0x62, ascii for character 'b';
- `number`      ->  `00000001`        ->  driver function #1.


これがお役に立てば幸いです。よろしく。

于 2013-08-21T00:19:53.453 に答える
1

このリンクによると、ioctlコマンド番号には複数のコンポーネントがあります。

  • type。マジックナンバー。このフィールドは_IOC_TYPEBITSビット幅(通常は8)です。
  • number。序数(順次)番号。_IOC_NRBITSビット幅です。(通常8)
  • direction。データ転送の方向。可能な値は、_IOC_NONE(データ転送なし)、_ IOC_READ、_IOC_WRITE、および_IOC_READ | _IOC_WRITE(データは双方向に転送されます)です。通常は2ビットです。
  • size。関連するユーザーデータのサイズ。幅は_IOC_SIZEBITS(14ビット)です。

実際の構成を確認するには、カーネルを参照してinclude/asm/ioctl.hください。Documentation/ioctl-number.txt

あなたの場合3222823425==0xC0186201

それで:

  • type== 0xC0
  • number== 0x18
  • direction== 0x1
  • size== 0x2201

(ビットの6は0110であるため、sizeは最初の2ビット(01)であり、残りのビットは入れられdata_type、0x2201のままです)

于 2013-01-08T08:37:26.320 に答える