OCTL _IO,_IOW,_IOWR 介绍
本文转自(http://blog.163.com/shaohj_1999@126/blog/static/6340685120106161190338/)
_IO, _IOR, _IOW, _IOWR 宏的用法与解析
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域:
bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。
bit29~bit16 14位为 "数据大小" 区,表示 ioctl() 中的 arg 变量传送的内存大小。
bit15~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() 的宏值。
beyes | 2009-09-26 11:23 |
这几个宏的使用格式为:
魔数 (magic number) 基(序列号)数 变量型
而 _IOC_TYPECHECK() 的定义正是:
设备驱动程序想要从传送的命令获取相应的值,就要使用下列宏函数: _IO 宏 该宏函数没有可传送的变量,只是用于传送命令。例如如下约定:
此时,省略由应用程序传送的 arg 变量或者代入 0 。在应用程序中使用该宏时,比如: ioctl (dev, TEST_DEV_RESET, 0) 或者 ioctl (dev, TEST_DRV_RESET) 。 这是因为变量的有效因素是可变因素。只作为命令使用时,没有必要判断出设备上数据的输出或输入。因此,设备驱动程序没有必要执行设备文件大开选项的相关处理。 _IOR 宏
这说明应用程序从设备读取数据的大小为 int 。下面宏用于判断传送到设备驱动程序的 cmd 命令的读写状态: 运行该宏时,返回值的类型如下:
使用该命令时,应用程序的 ioctl() 的 arg 变量值指定设备驱动程序上读取数据时的缓存(结构体)地址。 _IOW 宏 _IOWR 宏 _IOR() , _IOW(), IORW() 的定义: |
OCTL _IO,_IOW,_IOWR 介绍相关推荐
- ioctl _IO,_IOW,_IOWR
_IO, _IOR, _IOW, _IOWR 宏的用法与解析 在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有 ...
- linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
一._IO, _IOR, _IOW, _IOWR 宏的用法与解析 在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包 ...
- _IO,_IOR,_IOW,_IOWR
_IO,_IOR,_IOW,_IOWR 宏的用法与解析< DOCTYPE HTML PUBLIC -WCDTD HTML TransitionalEN> _IO, _IOR, _IOW, ...
- _IO, _IOR, _IOW, _IOWR 宏用法解析
_IO, _IOR, _IOW, _IOWR 宏的用法与解析 在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有 ...
- 转:linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...
- 构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解
在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...
- 构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解
在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...
- _IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析
在Linux驱动程序里, ioctl() 函数上传送的 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.在Linux里面应用了很多宏来定义,我在这里只是翻译成简单易懂的,直接用数字代替宏. 这 ...
- 新内核版本ioctl的变化 _IO, _IOR, _IOW, _IOWR 幻数的理解
kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl : ioctl,unlocked_ioctl和compat_ioctl 现在只有unloc ...
最新文章
- c语言函数库哪里keyk,[精品]C语言库函数(字母G-K)-教案.doc
- 【php】php编译pcntl以支持多进程
- 【CV】带你入门多目标跟踪(二)SORTDeepSORT
- 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)
- 睡觉时:新增的Java 8新增功能
- Ajax爬取豆瓣电影目录(Python)
- 《C和指针》——stdarg宏简介
- 7.16 c++自学笔记
- paip.模块化设计中常用属性与常用方法
- 深入浅出设计模式---4、适配器模式
- 1013_MISRA C规范学习笔记9
- php 导出的excel 科学计数法显示处理(记笔记)
- linux 根目录变为只读了,Linux系统重启或无故变为只读造成网站无法正常访问的简单临时的做 根目录只读不能写处理:...
- 快速查询多个圆通快递未签收单号的走件信息
- 在 Shell 脚本中调用另一个 Shell 脚本的三种方式
- php if多条件,php – 多个IF语句条件
- [转] TCP/IP原理、基础以及在Linux上的实现
- mysql_图形界面工具
- DRV8814PWPR
- python-司机和售票员