1

我只是很困惑如何将cmd=3222823425值分解为不同的部分以弄清楚该命令在 Linux 内核中的实际含义。我知道,有些函数正在ioctl使用以下参数发出命令,但我想知道这些参数值的含义。

fd=21, cmd=3222823425 and arg=3203118816 

我一直在查看各种论坛、手册页和其他链接,以弄清楚当系统调用cmd中的aioctl值为3222823425. 我发现 cmd 是一个由 组成的命令号,typenumber两个data_type8-bit整数(0-255)。

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

4

2 回答 2

4

请注意参考正确的文档以了解如何解码ioctl 命令。Documentation/ioctl-number.txt解释了如何创建的ioctl 代码,而上一个答案中链接的文档在关注 ioctl 创建之前概述了整个过程。asm/ioctl.h是一个更好的来源,因为 ioctl 实际掩码可能因不同的架构而异,但可以在include/asm-generic/ioctl.h和中找到对一般约定和位域含义和位置的解释Documentation/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.hDocumentation/ioctl-number.txt让您的内核查看实际配置。

对于您的情况 3222823425==0xC0186201

所以:

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

(6位是0110,所以size是前两位(01),其余位放入data_type,仍然是0x2201)

于 2013-01-08T08:37:26.320 回答