ioctl回顾

一、ioctl协议的命令组成

cmd本质为一个32位的数字,共分为四段:

31-30\]:读写方向dir,分为无数据(_IO)、读数据(_IOR)、写数据(_IOW)、读写数据(_IOWR)四种模式; \[29-16\]:传递数据的大小size,一般利用其宏_IO、_IOR等直接传入数据的类型,如int; \[15-8\]:命令的幻数type,表示设备的类型,可以是任意一个char型字符,如'a'、'b'、'c'等,其主要作用是使ioctl命令具有唯一的设备标识。不过在内核中'w'、'y'、'z'三个字符已经被使用了。 \[7-0\]:命令的编号nr,有多个ioctl命令时,从0开始往上编号; *** ** * ** *** ## 二、ioctl的宏 ### **生成cmd** **的宏:** _IO(type,nr):用来定义没有数据传递的命令 _IOR(type,nr,size):用来定义从驱动中读取数据的命令 _IOW(type,nr,size):用来定义向驱动写入数据的命令 _IOWR(type,nr,size):用来定义数据交换类型的命令,先写入数据,再读取数据这类命令。 ### **解析cmd** **的宏:** _IOC_DIR(cmd):解析命令的方向; _IOC_TYPE(cmd):解析命令的幻数; _IOC_NR(cmd):解析命令的编号; _IOC_SIZE(cmd):解析命令的复制数据大小; *** ** * ** *** ## 三、用于输入输出的时候需要注意的点 用于输入输出时需要使用copy_to_user或copy_from_user函数实现与用户空间的交互。其中,由于unlocked_ioctl函数中的arg参数是一个值,因此使用时需要注意: * 用户程序中ioctl函数虽然第三个参数是可变参数,但实际上只有一个,且传入的应为int类型数据的地址,即需要添加取地址符,如下: int rst = ioctl(fd, AFM_DEV_CMD_TEST, \&aaa); * 驱动程序中需要对传入的arg参数进行强制类型转换,将其变回地址类型,如下: copy_to_user((void __user \*)arg, \&success_rst, sizeof(success_rst)) copy_from_user(\&print_verbos, (void __user \*)arg, sizeof(print_verbos))

相关推荐
郝学胜-神的一滴15 分钟前
Linux 下循环创建多线程:深入解析与实践指南
linux·服务器·c++·程序人生·算法·设计模式
June`37 分钟前
深入解析网络层与数据链路层
linux·服务器·网络
老王熬夜敲代码41 分钟前
计算机网络--IP概念
linux·网络·笔记
Lynnxiaowen1 小时前
今天我们继续学习devops内容基于Jenkins构建CICD环境
linux·运维·学习·jenkins·devops
用户6135411460161 小时前
Linux 麒麟系统安装 gcc-7.3.0 rpm 包步骤
linux
小尧嵌入式1 小时前
Linux网络介绍网络编程和数据库
linux·运维·服务器·网络·数据库·qt·php
LUCIFER1 小时前
[驱动之路(七)——Pinctrl子系统]学习总结,万字长篇,一文彻底搞懂Pinctrl子系统(含Pin Controller驱动框架解析)
linux·驱动开发
山川而川-R1 小时前
在香橙派5pro上的ubuntu22.04系统烧录镜像
linux·运维·服务器
Ancelin安心2 小时前
关于代理的一些网络知识复盘
linux·运维·网络·计算机网络·web安全·ubuntu·网络安全
chenyuhao20242 小时前
Linux系统编程:多线程互斥以及死锁问题
linux·运维·服务器·c++·后端