驱动开发中ioctl cmd定义分析

参考RedHat内核,文件:include/asm-generic/ioctl.h,定义如下:

82  /* used to create numbers */
83  #define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0)
84  #define _IOR(type,nr,size)    _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
85  #define _IOW(type,nr,size)    _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
86  #define _IOWR(type,nr,size)    _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
87  #define _IOR_BAD(type,nr,size)    _IOC(_IOC_READ,(type),(nr),sizeof(size))
88  #define _IOW_BAD(type,nr,size)    _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
89  #define _IOWR_BAD(type,nr,size)    _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

其中_IOC定义如下:

include/asm-generic/ioctl.h
65  #define _IOC(dir,type,nr,size) \
66      (((dir)  << _IOC_DIRSHIFT) | \
67       ((type) << _IOC_TYPESHIFT) | \
68       ((nr)   << _IOC_NRSHIFT) | \

69       ((size) << _IOC_SIZESHIFT))

22  #define _IOC_NRBITS    8
23  #define _IOC_TYPEBITS    8

偏移量定义如下:
30  #ifndef _IOC_SIZEBITS
31  # define _IOC_SIZEBITS    14
32  #endif
33  
34  #ifndef _IOC_DIRBITS
35  # define _IOC_DIRBITS    2
36  #endif
43  #define _IOC_NRSHIFT    0
44  #define _IOC_TYPESHIFT    (_IOC_NRSHIFT+_IOC_NRBITS)        //type偏移量为8
45  #define _IOC_SIZESHIFT    (_IOC_TYPESHIFT+_IOC_TYPEBITS) //size偏移量为16

46  #define  _IOC_DIRSHIFT    (_IOC_SIZESHIFT+_IOC_SIZEBITS)     //dir偏移量为30

  #define _IOC_TYPECHECK(t) \
      ((sizeof(t) == sizeof(t[1]) && \                     //此处巧妙使用操作符sizeof检测type是否为类型,sizeof(type[N]) =sizeof(type) * N
        sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
        sizeof(t) : __invalid_size_argument_for_IOC)


注意事项:

1:IOR IOW等type参数必须为类型,不能为变量或者常量等,否则会编译错误;且type不能加sizeof,因为内核中已经添加;

2:魔数范围为0-255,一般赋值为字符;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值