关于构造IOCTL命令的学习心得

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码 本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。 阅读详情
在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。

   要按Linux内核的约定方法为驱动程序选择ioctl编号,应该首先看看include/asm/ioctl.h和Doucumention/ioctl-number.txt这两个文件。头文件定义了要使用的位字段:类型(幻数)、序数、传送方向以及参数大小等。ioctl-number.txt文件中罗列了内核所使用的幻数,选择自己的幻数要避免和内核冲突。以下是对include/asm/ioctl.h中定义的宏的注释:

#define         _IOC_NRBITS          8                                //序数(number)字段的字位宽度,8bits

#define         _IOC_TYPEBITS      8                                //幻数(type)字段的字位宽度,8bits

#define         _IOC_SIZEBITS       14                               //大小(size)字段的字位宽度,14bits

#define         _IOC_DIRBITS         2                                //方向(direction)字段的字位宽度,2bits

#define         _IOC_NRMASK        ((1 << _IOC_NRBITS)-1)     //序数字段的掩码,0x000000FF

#define         _IOC_TYPEMASK   ((1 << _IOC_TYPEBITS)-1)   //幻数字段的掩码,0x000000FF

#define         _IOC_SIZEMASK     ((1 << _IOC_SIZEBITS)-1)    //大小字段的掩码,0x00003FFF

#define         _IOC_DIRMASK      ((1 << _IOC_DIRBITS)-1)     //方向字段的掩码,0x00000003

#define        _IOC_NRSHIFT       0                                    //序数字段在整个字段中的位移,0

#define        _IOC_TYPESHIFT   (_IOC_NRSHIFT+_IOC_NRBITS)          //幻数字段的位移,8

#define        _IOC_SIZESHIFT    (_IOC_TYPESHIFT+_IOC_TYPEBITS)   //大小字段的位移,16

#define        _IOC_DIRSHIFT      (_IOC_SIZESHIFT+_IOC_SIZEBITS)     //方向字段的位移,30

/*

 * Direction bits.

 */

#define _IOC_NONE     0U     //没有数据传输

#define _IOC_WRITE   1U     //向设备写入数据,驱动程序必须从用户空间读入数据

#define _IOC_READ     2U     //从设备中读取数据,驱动程序必须向用户空间写入数据

/*

*_IOC 宏将dir,type,nr,size四个参数组合成一个cmd参数,如下图:

*

*/

#define _IOC(dir,type,nr,size) \

       (((dir)  << _IOC_DIRSHIFT) | \

        ((type) << _IOC_TYPESHIFT) | \

        ((nr)   << _IOC_NRSHIFT) | \

        ((size) << _IOC_SIZESHIFT))

/*

* used to create numbers 

*/

//构造无参数的命令编号

#define _IO(type,nr)             _IOC(_IOC_NONE,(type),(nr),0) 

//构造从驱动程序中读取数据的命令编号

#define _IOR(type,nr,size)     _IOC(_IOC_READ,(type),(nr),sizeof(size)) 

//用于向驱动程序写入数据命令

#define _IOW(type,nr,size)    _IOC(_IOC_WRITE,(type),(nr),sizeof(size))

//用于双向传输

#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

/* 

*used to decode ioctl numbers..

 */

//从命令参数中解析出数据方向,即写进还是读出

#define _IOC_DIR(nr)          (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)

//从命令参数中解析出幻数type

#define _IOC_TYPE(nr)              (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)

//从命令参数中解析出序数number

#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)


 

原文是说type的内容叫幻数(magic number),强调它是一个8位二进制数(number)。

因此不同type的命令就有不同的magic number,因此命令编码自然就不同了。但如果两个命令type相同,它们的magic number就相同,于是就不能仅靠type字段区分了。于是nr字段就起作用了:

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

nr(number)即序号,一般地我们从0开始编号。由于nr字段为8位二进制数,所以nr的取值范围为0~255。同一种type的命令每个nr值对应唯一一个命令。


使用自己的数据跑通mmsegmentation 使用自己的数据跑通mmsegmentation,解决以下报错:1)type object 'FileClient' has no attribute 'infer_client' 2)It is expected output_size equals to 2, but got size 3 3)训练测试结果报NAN 4)KeyError: 'MyDataset is not in the dataset registry' 5)预训练模型和加载的网络结构层名有差异,unexpected key ..... 阅读详情

相关推荐

[官方培训]22-UE资产优化 Epic 肖月 笔记

Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。

Tcohneyn的博客 1576

ioctl调用不执行问题的解决

在驱动开发中,ioctl是很常用的应用层与内核通信的接口,今天调试过程中遇到一个ioctl调用不执行的问题,有点意思,写篇博客记录一下。 对于网络设备,内核通过宏SIOCDEVPRIVATE给各个设备预留了一组私有ioctl命令,驱动可以自行定义响应函数来执行相应的操作。今天接到一个需求,要在驱动里添加一个清空用户统计信息的功能,于是相应的就需要增加一个ioctl命令供应用层调用。看了驱动代

ringrang的专栏 8539

Python 实战:高效绕过 reCAPTCHA v3 的自动化策略

本文深入探讨了使用Python高效绕过reCAPTCHA v3验证的实战策略。文章首先解析了reCAPTCHA v3无感验证的评分机制,随后详细介绍了两种核心解决方案:一是利用CapSolver等专业API服务直接获取有效token,二是通过Playwright模拟真人浏览器行为以提升评分。文中提供了从定位关键参数到代码实现的完整流程,并强调了合规操作与请求频率控制的重要性,为自动化开发者提供了切实可行的技术指南。

weixin_29057065的博客 490

linux ioctl 函数的cmd命令不能为2,否则无法执行内核态的ioctl。

最近在写一个linux驱动时,为了省事,ioctl的cmd参数直接使用宏定义的方式从0开始定义,但是调试程序时发现,当cmd=2时,在用户层调用ioctl却始终无法调用与用户态对应的内核态的ioctl函数,经常查阅资料发现,ioctl的cmd参数等于2是给内核使用的,当ioctl的cmd参数为2时,直接在虚拟文件系统那一层就直接返回给用户空间了,不会执行内核态的ioctl函数。因此要想定义cmd参...

zhangjianjun521的博客 1175

【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展,带操作系统FreeRTOS)

【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展) 文章目录【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展)1. 相关连接1.1 本项目相关连接1.2 无操作系统简易版(旧版,有OneNET云平台设备创建和应用配置,本文不再赘述):2. 具体功能3. 硬件环境4. 云平台环境配置5. 接线6. 功能展示6.1 数据流6.2 APP应用管理6.3 串口数据7. 源码详解7.1 源码文件解析7.2 服务器与wifi配置相关7.3 源码框架7.4

ssssadw的博客 2万+

轻量级替代方案:用AIFlowy + Ollama在本地快速搭建一个可用的AI智能体平台

本文介绍了如何使用AIFlowy和Ollama在本地快速搭建轻量级AI智能体平台,涵盖从环境准备到智能体集成的全流程。通过简化部署步骤和优化性能,15分钟内即可完成搭建,适用于原型验证和小团队协作,显著提升开发效率。

weixin_29207533的博客 221

linux ioctl函数及其驱动和应用程序注意事项

关于IOCTL驱动的编写方法LDD这本书确实写的比较明白了,在这呢我就简单的做一个介绍。这里我主要描述自己编写IOCTL驱动时所遇到的问题及其原因。    驱动里的ioctl函数主要实现不用read,write函数的与用户空间的简单数据交互及无参数的命令控制。那么我们如何实现这几种功能的IOCTL函数呢?ioctl驱动中以SWITCH{case A,case B}结构以实现对不同命令的响应,首先我

DiegoTJ的专栏 5976

【产品】 产品设计:ID设计和MD设计详解

1、ID(Industry Design)工业设计 包含外观、材质、手感、颜色配搭,主要界面的实现与及色彩等方面的设计。 2、MD(Mechanical Design)结构设计 以手机为例: 前壳、后壳、手机的摄像镜头位置的选择、固定的方式、电池如何连接和手机的厚薄程度等。 如果是滑盖手机,如何让手机滑上去,怎样实现自动往上弹,SIM卡怎样插和拔的安排,这些都是手机结构设计的范畴。 繁...

产品线负责人 3万+

[转] ioctl的命令cmd构造详解

转自:http://blog.youkuaiyun.com/helloanthea/article/details/25330809。 0 前言 之前对ioctl的cmd认知是:只要保证应用程序传入的与驱动程序定义的cmd一致即可。但是最近在开发某驱动程序过程中发现不是如此。当试图传入的命令字是0x0000_0002时,出现了Bad Address的错误,而且根本没有进入驱动程序定义的ioctl方法(

FireBird的专栏 3107

开尔文四线法与电桥(uΩ电阻检测)

本文介绍了开尔文四线法与电桥在电阻测量中的应用,特别是针对uΩ级别电阻的精确检测。讨论了基本电桥电路的工作原理,强调了开尔文四线法的优势,它能消除导线和接触电阻的影响。文中还提到了测试设备的介绍,包括不同级别的电阻测试,并详细阐述了uΩ级别电阻测试的步骤和注意事项。此外,对比了惠斯通电桥与开尔文电桥,强调了它们在电阻测量中的作用和计算方法。

让你爱上电路设计 7866

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习

本文介绍了工业缺陷检测的完整流程,从传统图像处理到深度学习方法。首先定义了缺陷检测任务的目标和应用场景,然后详细讲解了传统图像处理方法(边缘检测、阈值分割等)和深度学习方法(分类、检测、分割模型)。文章最后总结了核心要点,提出了思考题和实践建议,建议从简单方法开始逐步优化。下一篇将介绍工业视觉基础技术——相机标定与角点检测。

yonggeit的博客 2889

linux驱动程序的ioctl()函数的cmd参数不能为2

在linux2.6.32内核中,linux驱动程序的ioctl()函数的cmd参数不能为2,如果为2,ioctl()函数返回-1 记录于此,待补充。 另运行在mini2440开发板上的linux2.6.32时,HZ值为200,也就是jiffies每秒加200

feiniao1221的专栏 3439

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第一期(真题+解析)| TCP、UDP的区别;程序局部性;ICMP协议及主要功能;重定位所需的计算机硬件

在当今信息化时代,军队中对于计算机专业人才的需求与日俱增。因此,了解面试和复试中常见的问题和要求对于准备应聘者来说至关重要。本文将围绕面试的准备要点、常见问题以及面试技巧进行探讨,并提供一些建议和经验。通过了解面试和复试的准备要点、常见问题以及技巧,读者将能够提升应对能力和成功率。本文为准备军队文职面试和计划考研复试的读者提供了有价值的参考和指导。通过阅读本篇博客,读者将能够获得关于军队文职计算机类面试和计算机考研复试的全面了解,提升自身的应对能力和成功率。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1690

Jackson反序列化报错:ArrayList收到START_OBJECT怎么办

JSON 是前后端接口联调中最常用的数据交换格式,而 Jackson 是 Java 服务端主流的 JSON 反序列化工具。当接口的 DTO 字段声明为 List 类型时,Jackson 期望从 JSON 数组 Token(START_ARRAY)开始解析;如果请求体实际传入的是以 `{` 开头的对象,就会抛出 `Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token` 这类 JSON parse error。这

weixin_34342207的博客 200

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

构造IOCTL命令的学习心得-----_IO,…

在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。         在驱动程序里, ioct

不积跬步无以至千里,千里之行始于足下! 1145

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

关于构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR

在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。         在驱动程序里, ioc

少想多做 1229

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: c语言中结构体成员变量加“点”问题
下一篇: 从Cortex-M0编程方法到ARM9编程方法思想转变------定义命令
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值