你现在位置:首页>技术论文>软件知识>正文
ioctl相关知识
日期:2008-7-2 0:25:01 来源:本站整理  
点击: 作者:
点击【】放大字体.

ioctl相关知识

WWW_PLCJS_COM-PLC-技.术_网

一、 什么是ioctl

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:
WWcW_PLCJS_COM-PLC-技.术_网

  
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

  int ioctl(int fd, ind cmd, …);其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  
WWcW_PLCJS_COM-PLC-技.术_网

  ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。
WWW_PLCJS_COM-PLC-技.术_网

  
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  二、 ioctl的必要性
WWW_P※LCJS_COM-PLC-)技.术_网

  如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那就是蛮拧了。例如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约 定的数据流通过,如果有的话,那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会导致代码分工不明,程序结构混乱, 程序员自己也会头昏眼花的。
WWW_P※LCJS_COM-PLC-)技.术_网

  
WWW_PLC※JS_COM-PmLC-技.术_网

  所以,我们就使用ioctl来实现控制的功能。要记住,用户程序所作的只是通过命令码告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。
plcjs.技.术_网

  
WWW_P※LCJS_COM-PLC-)技.术_网

  三、 ioctl如何实现
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  读者只要把write换成ioctl,就知道用户程序的ioctl是怎么和驱动程 序中的ioctl实现联系在一起的了。
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  我这里说一个大概思路,因为我觉得《Linux设备驱动程序》这本书已经说的非常清楚了,但是得化一些时间来看。
WWW_PLCJS@_COM%-PLC-技.术_网

  
WWW.PLCJS.COM——可编程控制器技术门户

  在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现 这些操作,这是每一个程序员自己的事情,因为设备都是特定的,这里也没法说。关键在于怎么样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令 和驱动程序支持的途径。
WWW_PLCJS@_COM%-PLC-技.术_网

  
WW.W_PLCJS_COM-PLC-技.术_网

  命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,这样才不会将正确的命令发给错误的设备,或者是把错误的命令发给正确的设 备,或者是把错误的命令发给错误的设备。这些错误都会导致不可预料的事情发生,而当程序员发现了这些奇怪的事情的时候,再来调试程序查找错误,那将是非常困难的事情。所以在Linux核心中是这样定义一个命令码的:
WWW_PLC※JS_COM-PmLC-技.术_网

  ____________________________________
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

  | 设备类型 | 序列号 | 方向 |数据尺寸|
WWW_P※LCJS_COM-PLC-)技.术_网

  |----------|--------|------|--------|
WWW_PLCJS@_COM%-PLC-技.术_网

  | 8 bit  | 8 bit |2 bit |8~14 bit|
WWcW_PLCJS_COM-PLC-技.术_网

  |----------|--------|------|--------|
WWW_P※LCJS_CO※M-PLC-技-.术_网

  
WWW_PLCJS_COM-PLC-技.术_网

  这样一来,一个命令就变成了一个整数形式的命令码。但是命令码非常的不直观,所以Linux Kernel中提供了一些宏,这些宏可根据便于理解的字符串生成命令码,或者是从命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数据传送方向和数据传输尺寸。
WWW.PLCJS.COM——可编程控制器技术门户

  
WWW_P※LCJS_COM-PLC-)技.术_网

  这些宏我就不在这里解释了,具体的形式请读者察看Linux核心源代码中的和,文件里给除了这些宏完整的定义。这里我只多说一个地方,那就是"幻数"。
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  
WWW.PLCJS.COM——可编程控制器技术门户

  幻数是一个字母,数据长度也是8,所以就用一个特定的字母来标明设备类型,这和用一个数字是一样的,只是更加利于记忆和理解。就是这样,再没有更复杂的了。
plcjs.技.术_网

  
WWW_PLC※JS_COM-PmLC-技.术_网

  更多的说了也没有,读者还是看一看源代码吧,推荐各位阅读《Linux 设备驱动程序》所带源代码中的short一例,因为它比较短小,功能比较简单,可以看明白ioctl的功能和细节。
WWW_PL※CJS_COM-PLC-技.术_网

  
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  四、 cmd参数如何得出
plcjs.技.术_网

  这里确实要说一说,cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switch{case}结构进行相应的操作。
plcjs.技.术_网

  
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  要透彻理解,只能是通过阅读源代码,这篇文章实际上只是一个引子。Cmd参数的组织还是比较复杂的,我认为要搞熟它还是得花不少时间的,但是这是值得的,驱动程序中最难的是对中断的理解。
W1WW_P4LCJS_COM-PLC-技.术_网

  
WWW_PL※CJS_COM-PLC-技.术_网

  五、 小结
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  ioctl其实没有什么很难的东西需要理解,关键是理解cmd命令码是怎么在用户程序里生成并在驱动程序里解析的,程序员最主要的工作量在switch{case}结构中,因为对设备的I/O控制都是通过这一部分的代码实现的。
WW.W_PLCJS_COM-PLC-技.术_网

评论内容
载入中...
相关文章
商城相关
相关下载
博客相关
论坛相关
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
深圳秦合源科技有限公司 
   深圳市秦合源科技有限公司是国内领先的规模较大品种齐全的称重传感器(Loadce......
广州汇巨自动化设备有限公司 
   广州汇巨自动化设备有限公司是一家专业工业自动化产品和自动化设备开发、维修改造、电......
深圳联脉电子有限公司 
   公司自1998年创立以来,一直致力于工业控制产品的研发、制造、销售,目前有机房监......
北京力天昭阳科技发展有限公司 
   北京力天昭阳科技发展有限公司(PekingPowerSkyScience&......
东莞市友诚自动化 
   本公司专业代理台湾永宏、台达PLC、HITECH人机、特价供应文本显示器MD20......
深圳市爱威轮实业有限公司 
   爱威轮实业对广大用户的技术支持与服务,贯穿于与客户接触的每一个环节中,渗透在每一......
·栏目热门排行
·站内热门排行
载入中。。
报告错误·关于我们· 用户帮助· 联系我们 · 友情链接· 本站服务 · 合作伙伴 · 版权声明· 招聘信息 · 投搞指南

迅闻自动化工程部声明如下:
旗下网站:PLC技术网(www.plcjs.com)-可编程控制器技术门户
网站备案号:粤ICP备17165530号
网站法律顾问:ITLAW-庄毅雄律师
法律保护:PLC技术网,迅闻电子,plcjs.com,plcjs.net,plcjs.cn等字样

Copyright 2010-2015. All rights reserved. 

51La