ioctl 函数

ioctl函数是用户层与设备驱动交互的重要接口,用于发送控制命令和传递参数。cmd参数由幻数、序列号、数据传输方向和数据尺寸组成,通过预定义宏如_IOC_TYPE, _IOC_NR等构建。数据传输方向包括_IOC_NONE、_IOC_READ和_IOC_WRITE等。arg参数可以是实际数据或数据的地址。file_operations结构体包含unlocked_ioctl和compat_ioctl函数处理这些命令。博客深入探讨了cmd构建规则和arg参数类型。

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

ioctrl

参考文章
ioctrl详解
ioctrl详解

用户层ioctl 函数原型:

#include <sys/ioctl.h> 

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

这是一个可选参数函数,第3个参数为args。
fd: 文件描述符。
cmd: 控制命令。
arg: 参数。比如说控制定时器延时500ms,500ms 就是参数。

file_operations 中有以下两个函数:

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

除了struct file 以外后面连个参数都与应用层相同。

cmd 构建

cmd 参数是一个 无符号32 位数据,我们通常会定义成宏的形式,但是这个数据构建的规则由内核决定。

cmd 主要分为以下4个字段,每个字段都有不同的意义:

幻数序列号方向数据尺寸
8 bit8 bit2 bit8~14 bit
------------------------------------

幻数 : 实际上就是一个0~ 0xff 的数,,占8bit (_IOC_TYPEBITS) 。这个数是用来区分不同的驱动的。
序列号: 序数:用这个数来给自己的命令编号,占8bit (_IOC_NRBITS) ,我的程序从1开始排序。
数据传输方向: 占2bit(_IOC_DIRBITS)。如果涉及到要传参,内核要求描述一下传输的方向,传输的方向是以应用层的角度来描述的。

  1. _IOC_NONE:值为0,无数据传输。
  2. _IOC_READ:值为1,从设备驱动读取数据。
  3. _IOC_WRITE:值为2,往设备驱动写入数据。
  4. _IOC_READ | _IOC_WRITE:双向数据传输。

数据大小: 所传参数的长度。与体系结构相关,ARM下占14bit(_IOC_SIZEBITS),如果数据是int,内核给这个赋的值就是sizeof(int)。

内核提供了一些宏定义,让我们更方便构建cmd:

//type:类型	 //nr:序号   //size:参数长度
_IO(type,nr) //没有参数的命令
_IOR(type,nr,size) //该命令是从驱动读取数据
_IOW(type,nr,size) //该命令是从驱动写入数据
_IOWR(type,nr,size) //双向数据传输

arg 参数类型

参数的类型是一个 无符号32字节的数据,虽然是这样,但是我们可以灵活多用,完全可以传一个地址过去(指针也是4字节),这样就很方便了,传的时候转型,使用的时候在转回来。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值