如何在Linux 2.6.29中的ioctl中解码cmd = 3222823425?

时间:2013-01-08 07:39:26

标签: linux linux-kernel linux-device-driver

我很困惑,我怎么能将cmd=3222823425值分成不同的部分来弄清楚这个命令在Linux内核中实际意味着什么。我知道,有些函数正在使用以下参数进行ioctl命令,但我想知道这些参数值的含义。

fd=21, cmd=3222823425 and arg=3203118816 

我一直在研究各种论坛,手册页和其他链接,以便在cmd系统调用中的ioctl具有3222823425的值时表达这一点。我发现cmd是一个命令编号,由typenumberdata_type组成,前两个是8-bit整数(0-255)。

所以我的问题是如何解码这些参数值以找出这个调用正在尝试做什么?

2 个答案:

答案 0 :(得分:4)

请注意参考正确的文档,以了解如何解码 ioctl命令。 Documentation/ioctl-number.txt解释了如何创建 new ioctl代码,而前一个答案中链接的文档在关注ioctl创建之前概述了整个过程。 asm/ioctl.h是一个更好的来源,因为ioctl实际屏蔽可能因不同架构而异,但可以在include/asm-generic/ioctl.hDocumentation/ioctl-decoding.txt中找到对常规约定和位域含义和位置的解释。 / p>


从后者:


 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.


希望这可以提供帮助。 问候。

答案 1 :(得分:1)

根据此linkioctl命令编号包含多个组件:

  • 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.hDocumentation/ioctl-number.txt以获取内核以查看实际配置。

对于你的情况3222823425 == 0xC0186201

所以:

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

(6位为0110,因此size是前两位(01),其余位放入data_type,仍为0x2201)