Jun*_*aid 4 linux kernel system-calls
我只是很困惑,比如如何将cmd=3222823425
值分解为不同的部分以弄清楚该命令在 Linux 内核中的实际含义。我知道,有些函数正在ioctl
使用以下参数发出命令,但我想知道这些参数值的含义。
fd=21, cmd=3222823425 and arg=3203118816
Run Code Online (Sandbox Code Playgroud)
我一直在寻找到各种论坛,手册页等各个环节摸不着头脑就像是什么意思时,cmd
在ioctl
系统调用具有的价值3222823425
。我发现 cmd 是一个命令号,它由type
,number
和data_type
前两位是8-bit
整数(0-255)组成。
所以我的问题是如何解码这些参数值以找出这个调用试图做什么?
一个 ioctl 交给一个驱动程序,所以弄清楚一个 ioctl 正在做什么的最重要的事情是哪个驱动程序正在处理它。
你读过有关type
,number
并且data_type
是一个惯例,选择IOCTL数字时驱动程序编写者都应该使用。虽然不同的驱动程序可以使用相同的值来表示完全不同的东西,但最好避免这种情况,这样如果 ioctl 被意外发送到错误的设备,它很有可能会返回错误而不是导致某些灾难性事件.
Linux Device Drivers (LDD)一书的第 6 章对该约定进行了很好的描述。该data_type
实际上是(因为一些时间在2.6.X系列IIRC月初)由两个部分组成,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
Run Code Online (Sandbox Code Playgroud)
(如果您正在编写驱动程序,请使用中_IOC_*
定义的宏asm-generic/ioctl.h
。)
对于您的 ioctl 编号 3222823425 = 0xc0186201,我们得到 type=0x62(1999 年称为“bit3 vme 主机桥”)、number=1、direction=2 和 size=0x18=24,因此 ioctl 需要一个 24 字节的输入参数.
这个 ioctl 值应该被定义为_IOR(0x62, 0x01, struct somestruct)
或类似的东西_IOR('b', 1, struct somestruct)
,其中struct somestruct
是一个 24 字节的结构。如果不知道是什么驱动在处理ioctl,可以在内核源码中搜索这样的调用来收集候选。但是,请注意,简单的文本搜索通常找不到驱动程序,因为它们通常使用宏,例如#define FOOIO_TYPE 0x62
后跟#define FOOIO_SOMETHING _IOR(FOOIO_TYPE, 1, struct foobar)
.
除了 ioctl 所作用的文件描述符之外,ioctl 调用还有两个参数:ioctl 编号cmd
和参数arg
。参数可以是立即数或指向缓冲区的指针。在这里,如果驱动程序编写者遵循约定,则arg
应该是指向应用程序内存空间中 24 字节缓冲区的指针。
归档时间: |
|
查看次数: |
3260 次 |
最近记录: |