Android ioctl命令行无法传递大于0x7fffffff的io数

时间:2014-10-23 21:14:30

标签: android

似乎Android ioctl命令行可以接受的io编号限制,有谁知道为什么?

1 个答案:

答案 0 :(得分:0)

此限制来自<sys/ioctl.h>

间接包含的内核API

如果查看NDK分布,可能会在<asm-generic/ioctl.h>

中找到实际的声明

手臂版的摘录:

#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8
#define _IOC_SIZEBITS 14
#define _IOC_DIRBITS 2

#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)

最终它是以这种方式完成的,因为各种参数是位域,它们被合并在一起,为实际的系统调用进入内核的单个参数:

#define _IOC(dir,type,nr,size)   (((dir) << _IOC_DIRSHIFT) |   ((type) << _IOC_TYPESHIFT) |   ((nr) << _IOC_NRSHIFT) |   ((size) << _IOC_SIZESHIFT))

请注意,total是一个很好的32位参数,可以放在一个寄存器中。