【Linux Device Driver】—(3.1)—ioctl——原理

ioctl是Linux驱动中用于设备控制的关键方法,常用于报告错误信息、改变硬件设置等。用户空间调用时,参数可选取决于控制命令;内核中,未涉及数据传输的cmd参数值未定义。ioctl命令编码由类型、基数、方向和参数大小等组成,已使用的幻数在内核文档中记录。实现时,通常通过switch语句处理命令,返回值-EINVAL表示命令无效。参数检查至关重要,access_ok函数用于验证用户内存地址的有效性,避免错误操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大部分驱动除了需要具备读写设备能力外,还需要具备对硬件控制的能力,例如:要求设备报告错误信息改变模特率,这些操作常常通过ioctl方法来实现!

这里的东西看上去的却挺多,但是还是依照此次的原则,只是对自己知识的一个复习,所以也就懒得贴那么多的文字。

 

1、ioctl方法

 

用户空间:

int ioctl(int fd, unsigned long cmd, ...);

原型中的省略号表示这是一个可选的参数,存在与否依赖于控制命令(第2个参数)是否涉及到与设备的数据交互。

 

内核:

#include <linus/fs.h>

// 不使用BLK(大内核锁),降使用此种函数指针代替ioctl
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

// 兼容64位系统,将使用此函数指针代替
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

这里如果cmd命令不涉及数据传输,被驱动操作接收到的arg值是无定义的。

2、ioctl函数定义命令

 

ioctl命令编码被划分为几个段,include/asm/ioctl.h中定义了这些字段:类型(幻数),基数,传送方向,参数大小等。Documentation/ioctl-number.txt文件中罗列了再内核中已经使用的幻数。

 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值