我很困惑,我怎么能将cmd=3222823425
值分成不同的部分来弄清楚这个命令在Linux内核中实际意味着什么。我知道,有些函数正在使用以下参数进行ioctl
命令,但我想知道这些参数值的含义。
fd=21, cmd=3222823425 and arg=3203118816
我一直在研究各种论坛,手册页和其他链接,以便在cmd
系统调用中的ioctl
具有3222823425
的值时表达这一点。我发现cmd是一个命令编号,由type
,number
和data_type
组成,前两个是8-bit
整数(0-255)。
所以我的问题是如何解码这些参数值以找出这个调用正在尝试做什么?
答案 0 :(得分:4)
请注意参考正确的文档,以了解如何解码 ioctl命令。 Documentation/ioctl-number.txt
解释了如何创建 new ioctl代码,而前一个答案中链接的文档在关注ioctl创建之前概述了整个过程。 asm/ioctl.h
是一个更好的来源,因为ioctl实际屏蔽可能因不同架构而异,但可以在include/asm-generic/ioctl.h
和Documentation/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)
根据此link,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
是前两位(01),其余位放入data_type
,仍为0x2201)