linux驱动--ioctl接口

Linux 2.4及以后引入ioctl接口以解决设备操作的歧义问题,特别是软盘操作中的弹出命令。ioctl命令由魔数、序号、方向和数据尺寸组成,用于定制化的设备控制。在驱动开发中,通过定义cmd并利用宏函数进行参数检查和数据传输方向判断。在应用程序中,可以调用ioctl函数与驱动进行交互。
摘要由CSDN通过智能技术生成

内核中对底层设备操作完全可以通过read、write接口来实现,在linux 2.2之前都是没有ioctl接口的,2.4以后才引入ioctl接口。
典故(据说),以前在操作软盘时,需要弹出光盘时命令为eject,可以通过write写这个字符串来传输这个指令,但是此时,如果要往软盘中写入”eject”字符串时就出现了歧义的问题。虽然可以通过附加一些代码绕过这个问题,但是不是严谨的开发者的习惯。所以出现了iotcl接口。

int (*ioctl) (struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);
/*
inode与filp两个指针对应于应用程序传递的文件描述符fd,这和传递open方法的参数一样。
cmd 由用户空间直接不经修改的传递给驱动程序
arg 可选。
*/

这个里面主要的就是这个cmd,驱动开发人员定义好这个cmd,在接口内部就是根据cmd做的一个分支处理。
在Linux核心中是这样定义一个命令码的:
这里写图片描述

魔数:只是一个数字,位宽为8位。在驱动中直接定义数字,大多是一字符的形式定义的,不过这个也是在8位位宽的数字范围内。具体可以参考内核源码中的文档ioctl-number.txt.

序号:就是这个type中的序号,比如有些字符在内核中已经用了,但是对应的序号并没有用完。自己定义时可以继续跟着在后面定义。

方向:数据传送的方向,如果这个特殊的命令涉及数据传送. 可能的值是 _IOC_NONE(没有数据传输), _IOC_RE

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值