96SEO 2026-02-23 13:14 24
ms,verdana,arial,sans-serif;font-size:16px;fill…简介

一个字符设备驱动通常会实现常规的open、release、read和write接口但是如果需要扩展新的功能通常以ioctl接口的方式实现。
ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
.error-icon{fill:#552222;}#mermaid-svg-uY8EyPklf5e4ZMQo
.error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uY8EyPklf5e4ZMQo
.edge-thickness-normal{stroke-width:2px;}#mermaid-svg-uY8EyPklf5e4ZMQo
.edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uY8EyPklf5e4ZMQo
.edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uY8EyPklf5e4ZMQo
.edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uY8EyPklf5e4ZMQo
.edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uY8EyPklf5e4ZMQo
.marker{fill:#333333;stroke:#333333;}#mermaid-svg-uY8EyPklf5e4ZMQo
.marker.cross{stroke:#333333;}#mermaid-svg-uY8EyPklf5e4ZMQo
ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uY8EyPklf5e4ZMQo
.actor{stroke:hsl(259.6261682243,
87.9019607843%);fill:#ECECFF;}#mermaid-svg-uY8EyPklf5e4ZMQo
text.actortspan{fill:black;stroke:none;}#mermaid-svg-uY8EyPklf5e4ZMQo
.actor-line{stroke:grey;}#mermaid-svg-uY8EyPklf5e4ZMQo
.messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
.messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
path{fill:#333;stroke:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
.sequenceNumber{fill:white;}#mermaid-svg-uY8EyPklf5e4ZMQo
#sequencenumber{fill:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
path{fill:#333;stroke:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
.messageText{fill:#333;stroke:#333;}#mermaid-svg-uY8EyPklf5e4ZMQo
.labelBox{stroke:hsl(259.6261682243,
87.9019607843%);fill:#ECECFF;}#mermaid-svg-uY8EyPklf5e4ZMQo
.labelText,#mermaid-svg-uY8EyPklf5e4ZMQo
.labelTexttspan{fill:black;stroke:none;}#mermaid-svg-uY8EyPklf5e4ZMQo
.loopText,#mermaid-svg-uY8EyPklf5e4ZMQo
.loopTexttspan{fill:black;stroke:none;}#mermaid-svg-uY8EyPklf5e4ZMQo
.loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243,
87.9019607843%);fill:hsl(259.6261682243,
87.9019607843%);}#mermaid-svg-uY8EyPklf5e4ZMQo
.note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-uY8EyPklf5e4ZMQo
.noteText,#mermaid-svg-uY8EyPklf5e4ZMQo
.noteTexttspan{fill:black;stroke:none;}#mermaid-svg-uY8EyPklf5e4ZMQo
.activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uY8EyPklf5e4ZMQo
.activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uY8EyPklf5e4ZMQo
.activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uY8EyPklf5e4ZMQo
.actorPopupMenu{position:absolute;}#mermaid-svg-uY8EyPklf5e4ZMQo
.actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px
rgba(0,0,0,0.2);filter:drop-shadow(3px
0.4));}#mermaid-svg-uY8EyPklf5e4ZMQo
line{stroke:hsl(259.6261682243,
87.9019607843%);fill:#ECECFF;}#mermaid-svg-uY8EyPklf5e4ZMQo
circle,#mermaid-svg-uY8EyPklf5e4ZMQo
line{stroke:hsl(259.6261682243,
87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-uY8EyPklf5e4ZMQo
:root{--mermaid-font-family:"trebuchet
;参数描述fd文件描述符cmd交互协议设备驱动将根据cmd执行对应操作…可变参数arg依赖cmd指定的长度以及类型返回值执行成功时返回0失败则返回-1
long);在新版内核中unlocked_ioctl()与compat_ioctl()取代了ioctl()。
unlocked_ioctl()顾名思义应该在无大内核锁BKL的情况下调用compat_ioctl()compat全称compatible兼容的主要目的是为64位系统提供32位ioctl的兼容方法也是在无大内核锁的情况下调用。
在字符设备驱动开发中一般情况下只要实现unlocked_ioctl()即可因为在vfs层的代码是直接调用unlocked_ioctl()。
前文提到ioctl方法第二个参数cmd为用户与驱动的“协议”理论上可以为任意int型数据可以为0、1、2、3……但是为了确保该“协议”的唯一性ioctl命令应该使用更科学严谨的方法赋值在linux中提供了一种ioctl命令的统一格式将32位int型数据划分为四个位段如下图所示
include/uapi/asm-generic/ioctl.h#define
_IOC_SIZESHIFT))dir(direction)ioctl命令访问模式数据传输方向占据2bit可以为_IOC_NONE、_IOC_READ、_IOC_WRITE、_IOC_READ
_IOC_WRITE分别指示了四种访问模式无数据、读数据、写数据、读写数据type(device
type)设备类型占据8bit在一些文献中翻译为“幻数”或者“魔数”可以为任意char型字符例如‘a’、‘b’、‘c’等等其主要作用是使ioctl命令有唯一的设备标识。
**tips**Documentions/ioctl-number.txt记录了在内核中已经使用的“魔数”字符为避免冲突在自定义ioctl命令之前应该先查阅该文档。
nr(number)命令编号/序数占据8bit可以为任意unsigned
char型数据取值范围0~255如果定义了多个ioctl命令通常从0开始编号递增size涉及到ioctl第三个参数arg占据13bit或者14bit体系相关arm架构一般为14位指定了arg的数据类型及长度如果在驱动的ioctl实现中不检查通常可以忽略该参数。
通常而言为了方便会使用宏_IOC()衍生的接口来直接定义ioctl命令
include/uapi/asm-generic/ioctl.h/*
_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))同时内核还提供了反向解析ioctl命令的宏接口
include/uapi/asm-generic/ioctl.h/*
\kernel\drivers\haptics\haptics_ioctl.h*/#include
*用户空间和内核空间共用的头文件包含ioctl命令及相关宏定义可以理解为一份“协议”文件
_IOR(DEVICE_TYPE,HAPTICS_READ_REG_NR,ioctl_protocol_t
_IOW(DEVICE_TYPE,HAPTICS_WRITE_REG_NR,ioctl_protocol_t
}ioctl_protocol_t;#endif这个头文件是共用的因为他定义了协议的具体内容。
{printk(%s\n,__FUNCTION__);return
{printk(%s\n,__FUNCTION__);return
size%d\n,dir,size);//检验cmd是否正确//1.校验cmd_typeif(DEVICE_TYPE
cmd)//读寄存器{//校验nrif(HAPTICS_READ_REG_NR
sizeof(ioctl_protocol_t));printk(read_reg:%#02x\n,msg.reg_addr);msg.reg_value0xff;//这里模拟读寄存器的值//将读取到的值传给用户空间ret
sizeof(ioctl_protocol_t));}}else
cmd)//写寄存器{//校验nrif(HAPTICS_WRITE_REG_NR
sizeof(ioctl_protocol_t));printk(write_reg:%#02x%#02x\n,msg.reg_addr,msg.reg_value);//模拟写寄存器的值}}else//{printk(KERN_ERR
haptics_release,.unlocked_ioctl
0;//内核层只能使用printk不能使用printfprintk(KERN_EMERG
{misc_deregister(mdev);printk(KERN_EMERG
}module_init(haptics_init);//驱动入口
module_exit(haptics_exit);//驱动出口MODULE_AUTHOR(daokuan.zhugsi-in.com);//声明作者信息
这仅声明为GPL的第二版本上面是驱动代码负责解析ioctl命令。
open(filename,O_RDWR);if(fd0){printf(can
strcmp(argv[2],r)){msg.reg_addr
0x01;ioctl(fd,HAPTICS_READ_REG,msg);printf(read
msg.reg_addr,msg.reg_value);}else
strcmp(argv[2],w)){msg.reg_addr
0xff;ioctl(fd,HAPTCIS_WRITE_REG,msg);}else{printf(error
_IOR中第三个参数size是参数的大小用于驱动中解析使用但是如果是固定长度这个参数也没有用到。
理论上使用_IOR
或_IO是没有严格区别的所以我们上述代码中可以改为\#define
_IO(DEVICE_TYPE,HAPTICS_READ_REG_NR)
ioctl函数中第三个参数表示传入驱动的实际参数可以是一个整型值也可以是一个结构体指针。
我们示例中是传入的结构体指针。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback