Linux之ioctl

ioctl是Linux设备驱动程序中用于控制设备的函数。它允许用户空间通过特定命令码(cmd)向内核发送控制请求,驱动程序根据cmd实现相应功能。cmd包含设备类型、命令编号、访问模式和数据大小信息。在驱动程序内部,通常使用switch_case结构处理不同的cmd。文章提供了ioctl命令构造的示例,并引用了相关资源以供深入学习。
摘要由CSDN通过智能技术生成

目录

1. ioctl概念

2. 具体实现

3. 示例

4. 参考


 

1. ioctl概念

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

大部分驱动除了读写设备的能里,还需要通过设备驱动对硬件进行各种控制操作。例如,设备上锁,改变波特率,调整转速等等。所有这些命令都是通过ioctl来支持的。

  • 用户空间原型:
int ioctl(int fd, unsigned long cmd, ...);

fd: 文件描述符,用户程序使用open函数打开时代表文件的控制符

cmd: 用户程序对设备的控制命令

…: 表示一个单个可选的参数,传统上标识为char *argp,使用…只是为了组织在编译时的类型检查

  • 内核空间原型:
long (*unlocked_ioctl) (struct file *file, unsigned int cmd, unsigned long arg);

long (*compat_ioctl) (struct file *file, unsigned int cmd, unsigned long arg);

file: struct file结构体,代表一个打开的文件

cmd: IO操作指令,与用户空间的ioctl中的cmd相同

arg: 传递参数的指针地址,就是用户空间的ioctl的第三个参数地址。使用的话强制转__user指针,使用copy_from_user/copy_to_user操作。

2. 具体实现

通过ioctl, 用户空间只需要通过命令码(cmd)告诉设备驱动程序想要实现的功能,具体功能由设备驱动程序实现,故所有支持的命令码,都需要在设备驱动程序中实现。

在驱动程序中实现的ioctl函数内(file_operations属性),会实现一个switch_case结构,每一个case对应一个cmd所实现的功能。

命令码(cmd)是用户空间和内核空间(驱动程序)唯一的沟通途径。为了让命令能正确的发到相应的设备,Linux内核中对命令码有相应的定义:

type
(幻数)

number
(序数)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值