分享
 
 
 

关于驱动程序中的ioctl

王朝other·作者佚名  2006-04-20
窄屏简体版  字體: |||超大  

作者:coly(李勇)

来源:http://www.linuxforum.net/doc/ioctl-coly.html

摘要:介绍linux驱动程序中ioctl的概念、意义和用法

我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl,

所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混

了,这几天才弄明白它,于是在这里清理一下头脑。

一、 什么是ioctl。

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就

是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数

如下:

int ioctl(int fd, ind cmd, …);

其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设

备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和

cmd的意义相关的。

ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支

持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。

二、 ioctl的必要性

如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那就是蛮拧了。例如,我们可

以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话,

那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会

导致代码分工不明,程序结构混乱,程序员自己也会头昏眼花的。

所以,我们就使用ioctl来实现控制的功能。要记住,用户程序所作的只是通过命令码告

诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要

做的事情。

三、 ioctl如何实现

这是一个很麻烦的问题,我是能省则省。要说清楚它,没有四五千字是不行的,所以我这

里是不可能把它说得非常清楚了,不过如果有读者对用户程序怎么和驱动程序联系起来感

兴趣的话,可以看我前一阵子写的《write的奥秘》。读者只要把write换成ioctl,就知

道用户程序的ioctl是怎么和驱动程序中的ioctl实现联系在一起的了。

我这里说一个大概思路,因为我觉得《Linux设备驱动程序》这本书已经说的非常清楚

了,但是得化一些时间来看。

在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对

应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事

情,因为设备都是特定的,这里也没法说。关键在于怎么样组织命令码,因为在ioctl中

命令码是唯一联系用户程序命令和驱动程序支持的途径。

命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,这样才不

会将正确的命令发给错误的设备,或者是把错误的命令发给正确的设备,或者是把错误的

命令发给错误的设备。这些错误都会导致不可预料的事情发生,而当程序员发现了这些奇

怪的事情的时候,再来调试程序查找错误,那将是非常困难的事情。

所以在Linux核心中是这样定义一个命令码的:

____________________________________

| 设备类型 | 序列号 | 方向 |数据尺寸|

|----------|--------|------|--------|

| 8 bit | 8 bit |2 bit |8~14 bit|

|----------|--------|------|--------|

这样一来,一个命令就变成了一个整数形式的命令码。但是命令码非常的不直观,所以

Linux Kernel中提供了一些宏,这些宏可根据便于理解的字符串生成命令码,或者是从

命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数

据传送方向和数据传输尺寸。

这些宏我就不在这里解释了,具体的形式请读者察看Linux核心源代码中的和,文件里给

除了这些宏完整的定义。这里我只多说一个地方,那就是"幻数"。

幻数是一个字母,数据长度也是8,所以就用一个特定的字母来标明设备类型,这和用一

个数字是一样的,只是更加利于记忆和理解。就是这样,再没有更复杂的了。

更多的说了也没有,读者还是看一看源代码吧,推荐各位阅读《Linux 设备驱动程序》所

带源代码中的short一例,因为它比较短小,功能比较简单,可以看明白ioctl的功能和细

节。

四、 cmd参数如何得出

这里确实要说一说,cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、

数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解

码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过

switch{case}结构进行相应的操作。

要透彻理解,只能是通过阅读源代码,我这篇文章实际上只是一个引子。Cmd参数的组织

还是比较复杂的,我认为要搞熟它还是得花不少时间的,但是这是值得的,驱动程序中最

难的是对中断的理解。

五、 小结

ioctl其实没有什么很难的东西需要理解,关键是理解cmd命令码是怎么在用户程序里生成

并在驱动程序里解析的,程序员最主要的工作量在switch{case}结构中,因为对设备的

I/O控制都是通过这一部分的代码实现的。

参考资料:

1.《Linux 设备驱动程序》,鲁宾尼著,中国电力出版社。

2.《write的奥秘》,coly,真情流露(202.204.7.235)->电脑技术->Linux技术。

中国Linux论坛 版权所有

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有