zoukankan      html  css  js  c++  java
  • [宏]_IO, _IOR, _IOW, _IOWR 宏的用法与解析

    在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域:

    bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。

    bit29~bit15 14位为 "数据大小" 区,表示 ioctl() 中的 arg 变量传送的内存大小。

    bit20~bit08  8位为 “魔数"(也称为"幻数")区,这个值用以与其它设备驱动程序的 ioctl 命令进行区别。

    bit07~bit00   8位为 "区别序号" 区,是区分命令的命令顺序序号。

    像命令码中的 “区分读写区” 里的值可能是 _IOC_NONE (0值)表示无数据传输,_IOC_READ (读), _IOC_WRITE (写) , _IOC_READ|_IOC_WRITE (双向)。

    内核定义了 _IO() , _IOR() , IOW() 和 _IOWR() 这 4 个宏来辅助生成上面的 cmd 。下面分析 _IO() 的实现,其它的类似。



    在 asm-generic/ioctl.h 里可以看到 _IO() 的定义

    #define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0)


    再看 _IOC() 的定义

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


    可见,_IO() 的最后结果由 _IOC() 中的 4 个参数移位组合而成。

    再看 _IOC_DIRSHIT 的定义

    #define _IOC_DIRSHIFT    (_IOC_SIZESHIFT+_IOC_SIZEBITS)


    _IOC_SIZESHIFT 的定义

    #define _IOC_SIZESHIFT    (_IOC_TYPESHIFT+_IOC_TYPEBITS)


    _IOC_TYPESHIF 的定义

    #define _IOC_TYPESHIFT    (_IOC_NRSHIFT+_IOC_NRBITS)


    _IOC_NRSHIFT 的定义

    #define _IOC_NRSHIFT    0


    _IOC_NRBITS 的定义

    #define _IOC_NRBITS    8


    _IOC_TYPEBITS 的定义

    #define _IOC_TYPEBITS    8


    由上面的定义,往上推得到

    _IOC_TYPESHIFT = 8
    _IOC_SIZESHIFT = 16
    _IOC_DIRSHIFT = 30



    所以,(dir)  << _IOC_DIRSHIFT) 表是 dir 往左移 30 位,即移到 bit31~bit30 两位上,得到方向(读写)的属性;
                (size) << _IOC_SIZESHIFT) 位左移 16 位得到“数据大小”区;
                (type) << _IOC_TYPESHIFT) 左移 8位得到"魔数区" ;
               (nr)   << _IOC_NRSHIFT)      左移 0 位( bit7~bit0) 。

    这样,就得到了 _IO() 的宏值。

  • 相关阅读:
    HDU 1813 Escape from Tetris
    BZOJ 2276 Temperature
    BZOJ 4499 线性函数
    BZOJ 3131 淘金
    HDU 5738 Eureka
    POJ 2409 Let it Bead
    POJ 1286 Necklace of Beads
    POJ 1696 Space Ant
    Fox And Jumping
    Recover the String
  • 原文地址:https://www.cnblogs.com/cainiaoaixuexi/p/3148632.html
Copyright © 2011-2022 走看看