深入理解ioctl

简介:

《Linux设备驱动程序》ioctl详解

 


除了读取和写入设备之外,大部分驱动程序还需要通过设备驱动程序实行各种类型的硬件控制。简单的数据传输之外,大部分设备还可以执行其他一些操作,比如,用户空间经常会请求设备锁门,弹出介质,报告错误信息,改变波特率或者执行子破坏,等等。这些操作通常通过ioctl方法来支持。

 

ioctl在用户空间的原型:

 

int  ioctl(int fd, unsigned long  cmd, ...)

 

这里的...代表可变参数,他并不是代表任意数量的一组可变参数,通常,更具cmd来定,如果cmd不需要参数,那么...就不会被使用,如果cmd需要参数,则就会使用...所以,它只是代表一个可变参数。习惯上使用 char  *argp来定义。这里使用...就是为了编译时防止编译器进行类型检查。

 

ioctl命令


每个驱动,都会有自己的ictol命令,那么在不同的驱动,不同类型设备的驱动之间,这些命令必须唯一标示出来,例如,我们对非串口设备使用设置波特率的命令,如果按照通常意义上将,对ioctl命令从0或者1开始编号,假设1在串口驱动中代表设置波特率,由于其他原因,我们错误的在非串口设备中使用1的时候,可能并没有发生错误,只是进行了其他的操作而已,那么这是在驱动程序中不允许的。但是如果ioctl命令编号是唯一的,那么就不会出现这种无意间成功的完成了意想不到的操作。

 

为了方便程序员唯一的创建ioctl命令编号,内核中作了如下规定:

每一个命令号被分为多个字段。新的内核(2.6)中,定义号码的新方法中使用4个字段来唯一标示一个命令。

 

<linux/ioctl.h>中对个字段的位数做出了定义

 

 

type

         幻数。选择一个号码,并在整个驱动程序中使用这个号码。

 

number

         序数

 

direction

         传输方向。_IOC_NONE(没有数据传输),_IOC_READ,_IOC_WRITE以及_IOC_READ|_IOC_WRITE(双向)这些方向。传输方向是站在应用程序的角度来看的。如果应用程序需要从驱动中读取数据,则方向应该是_IOC_READ。

 

size

      所涉及的用户数据大小。对于大量数据传输可以忽略该字段。

 

以下是<linux/ioctl.h>中对各个字段所占的位数做出了说明

 

#define _IOC_NRBITS     8       //序数占8位
#define _IOC_TYPEBITS   8     //幻数占8位

/*
 * Let any architecture override either of the following before
 * including this file.
 */

#ifndef _IOC_SIZEBITS         //size字段
# define _IOC_SIZEBITS  14 
#endif

#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS   2    //direction 字段
#endif

 

对于自己的驱动,如果需要使用特定的ioctl命令,则必须创建ioctl命令以及编号。内核中给出了创建ioctl命令的宏

 

/* used to create numbers */
#define _IO(type,nr)            _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)      _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size)      _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size)     _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOR_BAD(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW_BAD(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

 

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/03/03/5341173.aspx
并请联系谭海燕本人或者前往谭海燕个人主页留言

目录
相关文章
|
存储 算法 生物认证
活体检测的几种手段分析
活体检测的手段比较多,目前比较通用的是人脸活体检测,但是实际应用中的还有指纹识别、虹膜识别、静脉识别,通过这些手段来增加安全性,活体检测在金融领域、军事管理中最先使用,目前也在渐渐的普及到各个民用行业。
865 0
活体检测的几种手段分析
|
存储 安全 Android开发
探索Android与iOS的隐私保护机制
在数字化时代,移动设备已成为我们生活的一部分,而隐私安全是用户最为关注的问题之一。本文将深入探讨Android和iOS两大主流操作系统在隐私保护方面的策略和实现方式,分析它们各自的优势和不足,以及如何更好地保护用户的隐私。
|
10月前
|
机器学习/深度学习 缓存 负载均衡
Qwen MoE关键细节:通过全局负载均衡提升模型性能和专家的特异化程度
Qwen MoE关键细节:通过全局负载均衡提升模型性能和专家的特异化程度
|
监控 搜索推荐 数据安全/隐私保护
深入探索iOS 14的隐私保护功能
本文将深入探讨iOS 14操作系统中的隐私保护功能,包括新的隐私指示器、应用程序跟踪透明度以及增强的隐私设置。我们将分析这些功能如何提高用户对个人数据的控制权,并讨论它们对应用开发者和广告行业的影响。
419 28
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
GEE错误——‘xxx‘ did not match any bands.
GEE错误——‘xxx‘ did not match any bands.
2410 1
|
数据安全/隐私保护
[UTCTF2020]babymips 题解
[UTCTF2020]babymips 题解
259 1
|
存储 缓存 编解码
Web开发中的图片管理:策略与实践
1. 图片优化 图片优化是网站性能优化中的重要一环,这涉及到多个方面,包括减少文件大小,选择正确的图片格式,实现响应式图片,以及考虑图片的懒加载或预加载。
678 0
|
SQL Oracle 关系型数据库
如何断开所有连接oracle的用户--解决ORA-01940:无法删除当前连接的用户
如何断开所有连接oracle的用户--解决ORA-01940:无法删除当前连接的用户
|
数据采集 数据可视化 数据挖掘
使用Sentieon BWA-Meth进行WGBS甲基化分析,速度和精度双提升
在甲基化分析中,Sentieon软件可以与其他工具结合使用以提高分析速度和准确性。在这种情况下,Sentieon BWA被用来替换原始的BWA-mem,与MethyDackel结合,建立起Sentieon BWA-Meth流程。 在这个流程中,Sentieon BWA首先负责处理亚硫酸盐转化后的测序数据进行高效的序列比对。由于Sentieon BWA的优化,比对速度和准确性得到了提高,同时减少了计算资源的消耗。
865 0
使用Sentieon BWA-Meth进行WGBS甲基化分析,速度和精度双提升