关于Linux驱动ioctrl的幻数

枫叶雪 2014-12-29 04:30:45
在学习LDD3过程中,看到关于ioctrl的部分。书上说“ioctrl-number.txt文件中罗列了内核所使用的幻数”,在选择自己所使用的幻数时应该根据此文件中的内容避免和内核冲突。
我也看到了这个文件中罗列了好多,可是有点看不懂啊~
如下图:

226行,幻数'k',序数使用了00-0F的值;
227行,幻数‘k',序数使用了00-05的值;
228行,幻数’k‘,序数使用了10-17的值。
这样的话,00-0F和00-05是有重叠的,是不是冲突啊~~~~~
不是不可以冲突的嘛??内核自己的都冲突了呀,comment里都写了“conflict!”。。。

所以想问一下大家:这种冲突可以吗,是怎么回事?在写自己的驱动时,应该怎么选取幻数和它使用的序数?只要这个文件中提到的,我们都不能用吗?
...全文
421 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
枫叶雪 2014-12-29
  • 打赏
  • 举报
回复
引用 3 楼 falloutmx 的回复:
幻数的本意是为了避免在错误的设备中使用正确的命令,所以不是绝对不能冲突的东西。就像很多时候不用幻数,驱动也能正常工作一样。
那就是说,ioctrl-number.txt文件中标出的“conflict!”的驱动,是不能同时在一个内核里出现的啦?(我觉得是,否则不会写个conflict。文件中列出的驱动,要用那些序数都是跟Linus打招呼了吧。有冲突的就标示出来了) 这样的话,如果自己写的驱动需要使用ioctrl,若是跟ioctel-number.txt列出的有冲突,但在内核中不存在那个驱动,如果这驱动不在别人机器上用,那就不会在错误的设备上使用正确的命令。 是这个意思吧~?
falloutmx 2014-12-29
  • 打赏
  • 举报
回复
幻数的本意是为了避免在错误的设备中使用正确的命令,所以不是绝对不能冲突的东西。就像很多时候不用幻数,驱动也能正常工作一样。
奔跑的路 2014-12-29
  • 打赏
  • 举报
回复
http://blog.csdn.net/lee244868149/article/details/40149569

三、ioctl中的cmd


一个cmd被分为了4个段,每一段都有各自的意义,cmd的定义在<linux/ioctl.h>。注:但实际上<linux/ioctl.h>中只是包含了<asm/ioctl.h>,这说明了这是跟平台相关的,ARM的定义在<arch/arm/include/asm/ioctl.h>,但这文件也是包含别的文件<asm-generic/ioctl.h>,千找万找,终于找到了。


在<asm-generic/ioctl.h>中,cmd拆分如下:

解释一下四部分,全部都在<asm-generic/ioctl.h>和ioctl-number.txt这两个文档有说明。

1)幻数:说得再好听的名字也只不过是个0~0xff的数,占8bit(_IOC_TYPEBITS)。这个数是用来区分不同的驱动的,像设备号申请的时候一样,内核有一个文档给出一些推荐的或者已经被使用的幻数。

/*Documentation/ioctl/ioctl-number.txt*/

164 'w' all CERN SCI driver

165 'y' 00-1F packet based user level communications

166 <mailto:zapman@interlan.net>

167 'z' 00-3F CAN bus card

168 <mailto:hdstich@connectu.ulm.circular.de>

169 'z' 40-7F CAN bus card

170 <mailto:oe@port.de>

可以看到'x'是还没有人用的,我就拿这个当幻数!


2)序数:用这个数来给自己的命令编号,占8bit(_IOC_NRBITS),我的程序从1开始排序。


1,324

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧