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))
相关推荐
宇晨T9 小时前
BurpSuite实战:WackoPicko敏感目录探测
linux·运维·服务器
月巴月巴白勺合鸟月半9 小时前
在Linux下开发桌面程序
linux·运维·服务器
zh路西法9 小时前
【tmux入门】终端分屏、SSH远程守护与一键启动脚本
linux·运维·ssh·bash
qq_163135759 小时前
Linux 【03-pwd命令超详细教程】
linux
学途路漫漫9 小时前
Ubuntu 24.04 国内网络环境全面优化指南
linux·网络·ubuntu
c238569 小时前
GDB 进程概念详解(下篇)—— 多进程与进阶调试能力
linux·服务器·数据库
RisunJan9 小时前
Linux命令-php(PHP语言的命令行接口)
linux·php
A_humble_scholar9 小时前
Linux(八) 进程内存全景:环境变量、main 函数参数与虚拟地址空间全链路深度解析
linux·运维·服务器
longforus9 小时前
linux上播放音乐的终极解决方案
linux·音频·折腾
xcLeigh9 小时前
鸿蒙PC平台 Shotwell 照片管理器适配实战:从 Linux GNOME 到 鸿蒙PC 的 Electron 迁移
linux·electron·harmonyos·鸿蒙·shotwell·照片管理器