关于ioctl幻数构造
要 按 Linux 内核的约定方法为驱动程序选择 ioctl 编 号,应该首先看看 include/asm/ioctl.h (我在网上下载的是2.6.29内核,在asm下没用找到ioctl.h文件,相应的变换到了目录asm-generic下)和 Doucumention/ioctl-number.txt 这 两个文件。头文件定义了要使用的位字段:类型(幻数)、序数、传送方向以及参数大小等。 ioctl-number.txt 文 件中罗列了内核所使用的幻数,选择自己的幻数要避免和内核冲突。以下是对 include/asm/ioctl.h 中 定义的宏的注释:
#define _IOC_NRBITS 8 // 序数( number )字段的字位宽度, 8bits
#define _IOC_TYPEBITS 8 // 幻数( type )字段的字位宽度, 8bits
#define _IOC_SIZEBITS 14 // 大小( size )字段的字位宽度, 14bits
#define _IOC_DIRBITS 2 // 方向( direction )字段的字位宽 度, 2bits
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) // 序数字段的掩 码, 0x000000FF
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) // 幻数字段的掩 码, 0x000000FF
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) // 大小字段的掩 码, 0x00003FFF
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) // 方向字段的掩 码, 0x00000003
#define _IOC_NRSHIFT 0 // 序数字段在整个 字段中的位移, 0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) // 幻数字段的位 移, 8
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) // 大小字段的位 移, 16
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) // 方向字段的位 移, 30
/*
* Direction bits.
*/
#define _IOC_NONE 0U // 没有数据传输
#define _IOC_WRITE 1U // 向设备写入数 据,驱动程序必须从用户空间读入数据
#define _IOC_READ 2U // 从设备中读取数 据,驱动程序必须向用户空间写入数据
/*
*_IOC 宏将 dir , type , nr , size 四个参数组合成一个 cmd 参数,如下图:
*
*/
#define _IOC (dir ,type ,nr ,size ) /
(((dir ) << _IOC_DIRSHIFT) | /
((type ) << _IOC_TYPESHIFT) | /
((nr ) << _IOC_NRSHIFT) | /
((size ) << _IOC_SIZESHIFT))
/*
* used to create numbers
*/
// 构造无参数的命令编号
#define _IO (type ,nr ) _IOC(_IOC_NONE,(type ),(nr ),0)
// 构造从驱动程序中读取数据的命令编号
#define _IOR (type ,nr ,size ) _IOC(_IOC_READ,(type ),(nr ),sizeof(size ))
// 用 于向驱动程序写入数据命令
#define _IOW (type ,nr ,size ) _IOC(_IOC_WRITE,(type ),(nr ),sizeof(size ))
// 用 于双向传输
#define _IOWR (type ,nr ,size ) _IOC(_IOC_READ|_IOC_WRITE,(type ),(nr ),sizeof(size ))
/*
*used to decode ioctl numbers..
*/
// 从命令参数中解析出数据方向,即写进还是读出
#define _IOC_DIR (nr ) (((nr ) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
// 从命令参数中解析出幻数 type
#define _IOC_TYPE (nr ) (((nr ) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
// 从命令参数中解析出序数 number
#define _IOC_NR (nr ) (((nr ) >> _IOC_NRSHIFT) & _IOC_NRMASK)
// 从命令参数中解析出用户数据大小
#define _IOC_SIZE (nr ) (((nr ) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
/* ...and for the drivers/sound files... */
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
关于ioctl幻数构造相关推荐
- linux字符设备驱动的 ioctl 幻数
在Linux字符设备驱动入门(一)中,我们实现了字符设备的简单读写字符功能,接下来我们要在这个基础上加入ioctl功能.首先,我们先来看看3.0内核下../include/linux/fs.h中fil ...
- linux3.0字符设备驱动,linux字符设备驱动的 ioctl 幻数
在Linux字符设备驱动入门(一)中,我们实现了字符设备的简单读写字符功能,接下来我们要在这个基础上加入ioctl功能.首先,我们先来看看3.0内核下../include/linux/fs.h中fil ...
- 驱动程序实例(一):LED设备驱动程序( platform + cdev)
结合之前对Linux内核的platform总线 ,以及对字符设备的cdev接口的分析,本文将编写基于platform总线与cdev接口的LED设备的实例代码并对其进行分析. platform总线分析, ...
- linux2.6驱动学习笔记之字符驱动
1.字符驱动组成 1.1字符驱动的模块加载与卸载 //设备结构体模板 struct xxx_dev_t { struct cdev cdev; ...... }xxx_dev; 在字符驱动模块加载函数 ...
- 构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解
在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...
- 构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解
在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...
- 新内核版本ioctl的变化 _IO, _IOR, _IOW, _IOWR 幻数的理解
kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl : ioctl,unlocked_ioctl和compat_ioctl 现在只有unloc ...
- IOCTL命令-_IO, _IOR, _IOW, _IOWR 幻数的理解
有一年半时间没有一行一行的写过linux驱动程序了,有的东西会发现遗忘了,今天就当是复习一下吧. 在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在 ...
- ioctl -构造命令编号 _IO,_IOW,_IOR,_IOWR
原文地址:http://blog.chinaunix.net/uid-20754793-id-177774.html 今天在写字符驱动验证程序的时候要用到ioctl函数,其中有一个cmd参数,搞了半天 ...
最新文章
- [UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode
- php修改数据库字段内容,php对数据库的增删改查操作
- 刚学编程的程序员必备这5大编程网站,你知道几个?
- Intel VT学习笔记(七)—— EPT物理地址转换
- c++运算符重载中很多人易忘的小细节
- java jdbc数据库五种连接方式
- jenkins 自带环境变量
- 一本名不符实的.NET书籍: Game Engine Toolset Development
- docker搭建sonar服务
- 软考初级程序员主要考什么?如何复习?
- emu8086,汇编程序:屏幕输入字符串,设置寄存器的值
- 服务器如何设置内网IP地址
- 4 月 1 日罗永浩直播首秀带货小米 10,你会剁手吗?
- 数字和模拟混合供电20190221
- 线上事件处理流程规范
- 计算机卡慢解决方法,电脑很卡怎么办,详细教您电脑很卡很慢应该怎么解决
- 你了解设计公司的服务内容有哪些吗?
- 医院九阵系统服务器电源,九阵医院信息管理系统
- Revit二次开发-根据两个点创建剖面视图
- 【图结构】之图注意力网络GAT详解
热门文章
- 学习web第四周第五天
- python魔方方法超详细介绍
- 咋筛选变量进入多因素回归 纳入变量 变量选择 类似机器学习的特征选择 cox回归分析cox多因素
- 网游中针对网络延迟的优化
- SE-Networks
- apache 2.4 httpd 2.4.6 反向代理后端的服务为HTTPS https 基于centos7
- mac mongodb : 715: /data/db/WiredTiger.turtle: handle-open: open: Permission denied
- 小米笔记本重装系统后触摸板失灵 的原因之一
- OpenCV入门(3):图像的组成,色彩空间及通道的分离合并
- python入门指南by许半仙百度云-Python入门指南 作者:许半仙(4)