ioctl.h 分析

2024-06-06 09:58
文章标签 分析 ioctl

本文主要是介绍ioctl.h 分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ioctl.h 分析





我自己画了个解析图。。。不要嫌弃丑啊。。。哈哈

 
type

The magic number. Just choose one number (after consultingioctl-number.txt ) and use it throughout the driver. This field is eight bits wide (_IOC_TYPEBITS).


number.

          The ordinal (sequential) number. It’s eight bits ( _IOC_NRBITS) wide.


direction

The direction of data transfer,if the particular command involves a data transfer. The possible values are _IOC_NONE (no data transfer), _IOC_READ, _IOC_WRITE, and _IOC_READ|_IOC_WRITE(data is transferred both ways). Data transfer is seen from the application’s point of view; _IOC_READ means reading from the device, so the driver must write to user space. Note that the field is a bitmask,so _IOC_ READ and _IOC_WRITE can be extracted using a logical AND operation.

size

The size of user data involved.The width of this field is architecture dependent, but is usually 13 or 14 bits.You can find its value  for your specific architecture in the macro _IOC_SIZEBITS. It’s not mandatory that you use the size field—the kernel does not check it—but it is a goodidea.Proper use of this field can help detect user-space programming errors and enable you to implement backward compatibility if you ever need to change the size of the relevant data item. If you need larger data structures, however,you can just ignore the size field. We’ll see how this field is used soon.


#ifndef _UAPI_ASM_GENERIC_IOCTL_H
#define _UAPI_ASM_GENERIC_IOCTL_H/* ioctl command encoding: 32 bits total, command in lower 16 bits,* size of the parameter structure in the lower 14 bits of the* upper 16 bits.* Encoding the size of the parameter structure in the ioctl request* is useful for catching programs compiled with old versions* and to avoid overwriting user space outside the user buffer area.* The highest 2 bits are reserved for indicating the ``access mode''.* NOTE: This limits the max parameter size to 16kB -1 !*//** The following is for compatibility across the various Linux* platforms.  The generic ioctl numbering scheme doesn't really enforce* a type field.  De facto, however, the top 8 bits of the lower 16* bits are indeed used as a type field, so we might just as well make* this explicit here.  Please be sure to use the decoding macros* below from now on.*/
#define _IOC_NRBITS	8
#define _IOC_TYPEBITS	8/** Let any architecture override either of the following before* including this file.*/#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS	14
#endif#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS	2
#endif#define _IOC_NRMASK	((1 << _IOC_NRBITS)-1)           //0xff
#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)     //0xff
#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1)     //0x3fff
#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1)      //0x3/*这部分是NR TYPE SIZE DIR 段在32bit数据中储存位置相对于起始0位置的偏移量*/
#define _IOC_NRSHIFT	0
#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS)   //0x8
#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS)//0x10
#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS)//0x1E/** Direction bits, which any architecture can choose to override* before including this file.*/
/*io 读写权限宏*/
#ifndef _IOC_NONE
# define _IOC_NONE	0U
#endif#ifndef _IOC_WRITE
# define _IOC_WRITE	1U
#endif#ifndef _IOC_READ
# define _IOC_READ	2U
#endif/*_IOC 适用于将dir, type nr size 这四个信息合成到一个32bit的数据中*/
#define _IOC(dir,type,nr,size) \(((dir)  << _IOC_DIRSHIFT) | \((type) << _IOC_TYPESHIFT) | \((nr)   << _IOC_NRSHIFT) | \((size) << _IOC_SIZESHIFT))#ifndef __KERNEL__
#define _IOC_TYPECHECK(t) (sizeof(t))
#endif/* used to create numbers */
#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))/*一下三个BAD结尾的宏定义我也没看明白为什么最后一个参数是sizeof(size) 就得跟一个BAD*/
#define _IOR_BAD(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW_BAD(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR_BAD(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))/* used to decode ioctl numbers.. *//*从32bit的数据中解码出DIR TYPE NR SIZE,很简单没啥讲的*/
#define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
#define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr)		(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)/* ...and for the drivers/sound files... */#define IOC_IN		(_IOC_WRITE << _IOC_DIRSHIFT)
#define IOC_OUT		(_IOC_READ << _IOC_DIRSHIFT)
#define IOC_INOUT	((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
#define IOCSIZE_MASK	(_IOC_SIZEMASK << _IOC_SIZESHIFT)
#define IOCSIZE_SHIFT	(_IOC_SIZESHIFT)#endif /* _UAPI_ASM_GENERIC_IOCTL_H */








这篇关于ioctl.h 分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035782

相关文章

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java