深入理解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
并请联系谭海燕本人或者前往谭海燕个人主页留言

时间: 2025-01-26 20:27:29

深入理解ioctl的相关文章

Unix编程之ioctl函数详解

我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. 一. 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的调用个数如下: int ioctl(int fd, ind cmd, -): 其中fd是用户程序打开设备时使用open

理解和使用NT驱动程序的执行上下文

理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的"执行上下文".理解并小心地应用这个概念可以帮助你构建更快.更高效的驱动程序.   NT标准内核模式驱动程序编程的一个重要观念是某个特定的驱动程序函数执行时所处的"上下文".传统上文件系统开发者最关注这个问题,但所有类型的NT内核模式驱动程序的编写者都能从执行上下文的深刻理解中获益.小心谨慎地使用执行上下文的概念能帮助构建更高性能.更低开销的驱动程序设计.   在本文中,我们将探寻执行上下文的概

ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机

英文原文:https://lwn.net/Articles/658511/.本文在翻译的基础上加了一些自己的理解.   qemu.virtual box.vmware.xen都是虚拟机,一般用户接触到的virtual box和vmware比较多,都是用来ubuntu中跑windows,或者windows中跑ubuntu的. qemu其实是鼎鼎大名的最基础的开源模拟器,可以纯软件模拟x86.arm.mips,这一点完虐其它模拟器:也可以使用硬件加速,比如linux下kvm和windows以及mac

深入理解proc文件系统

原文转自:http://www.cnblogs.com/cute/archive/2011/04/20/2022280.html 另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html        Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这

Linux设备驱动之Ioctl控制【转】

  转自:http://www.cnblogs.com/geneil/archive/2011/12/04/2275372.html 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力. 一.在用户空间,使用ioctl系统调用来控制设备,原型如下: int ioctl(int fd,unsigned long cmd,...);/*fd:文件描述符cmd:控制命令...:可选参数:插入*argp,具体内容依赖于cmd*/ 用户程序所作的只是通过命令码告诉驱动程序它想做什么,至于

C/C++:如何理解复杂的声明

http://blog.chinaunix.net/u/12783/showart_378340.html   C/C++:如何理解复杂的声明 这里说的声明,不光适用于C/C++,其他的一些语言也能适用. 与java和C#等不同,声明和定义在C/C++中有着比较明显的区别:声明仅仅是介绍名字(introduce names),而定义则会为该名字分配相应的空间.打个通俗的比喻:声明就是你在谈话中提到某个人的名字,而定义就是把你提到的这个人带到谈话的人群中来,让大家见识一下他/她是什么样子. 这里主

编程-我这个有不理解的地方帮我讲讲好吗?

问题描述 我这个有不理解的地方帮我讲讲好吗? #include ""mainwindow.h""#include ""ui_mainwindow.h""#include <QTextFrame>#include <QDebug>#include <QLineEdit>#include <QDialog>#include <QPushButton>#include &l

HTTP协议是无状态协议,怎么理解

HTTP协议是无状态协议,怎么理解?   Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.  自己的理解,在asp.net里:每次提交服务器的页面没有任何关系,每次记录在页面的信息下次提交是记不住的,(除了应用本身可能已经存储在全局对象中的所有信息外)在.net里实际就是ViewState,ViewState是asp.net中保存页面信息的基本单位,应用时就是保存在控

理解finalize()-析构函数替代者

函数 理解finalize()-析构函数替代者   在许多方面,Java 类似于 C++.Java 的语法非常类似于 C++,Java 有类.方法和数据成员:Java 的类有构造函数: Java 有异常处理.       但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性.这些特性之一就是析构函数.取代使用析构函数,Java 支持finalize() 方法.       在本文中,我们将描述 finalize() 与 C++ 析构函数的区别.另外,我们将创建一个简单的 A