linux设备驱动之字符设备驱动

一、cdev结构体

成员/功能说明相关操作函数/宏
kobj内嵌的kobject对象,用于Linux设备模型管理,实现引用计数和sysfs接口kobject_init()
owner指向拥有该结构体的模块指针(通常为THIS_MODULE),防止模块卸载时设备仍被使用模块宏THIS_MODULE
ops指向file_operations结构体的指针,定义设备操作接口(如read/writecdev_init()初始化时绑定
list链表头,用于将多个cdev连接成链表,由内核统一管理list_add()等内核链表操作
dev设备号(32位),高12位为主设备号,低20位为次设备号MKDEV()MAJOR()MINOR()
count设备实例数量(如一个驱动管理多个同类设备)注册时通过cdev_add()count参数指定
初始化函数cdev_init():关联cdevfile_operationscdev_alloc():动态分配cdev内存cdev_init(struct cdev *, struct file_operations *)
注册/注销函数cdev_add():向内核注册设备;cdev_del():注销设备需配合register_chrdev_region()alloc_chrdev_region()使用
设备号管理register_chrdev_region():已知设备号时注册;alloc_chrdev_region():动态申请未占用设备号释放设备号需调用unregister_chrdev_region()

 二、字符设备驱动的组成

组件功能描述关键数据结构/API开发注意事项
设备号管理标识设备实例(主设备号区分驱动,次设备号区分实例)dev_t类型、MKDEV()/MAJOR()/MINOR()宏、register_chrdev_region()或动态分配alloc_chrdev_region()48需避免直接操作设备号位宽,使用内核宏保证兼容性4
cdev结构体内核中描述字符设备的核心对象,关联操作方法与设备号struct cdev(含kobjopsdev等成员)、cdev_init()初始化、cdev_add()注册58需通过cdev_del()注销防止内存泄漏8
file_operations定义设备操作接口(如open/read/write/ioctlstruct file_operations(需实现至少ownerreadwrite等函数指针)35用户空间数据交互需使用copy_{to,from}_user()保证安全23
设备文件节点用户空间访问设备的入口(如/dev/xxx手动mknod或自动生成(class_create()+device_create())18推荐自动生成节点以适配现代内核1
模块初始化/退出驱动加载/卸载时的资源管理module_init()/module_exit()宏、资源释放函数(如unregister_chrdev_region())12必须实现清理逻辑防止残留2
同步机制处理多进程/线程并发访问mutex_lock()spin_lock()等内核同步原语7需根据场景选择锁类型(如互斥锁适合长时间持有)7
调试与日志驱动调试信息输出printk()分级日志、dynamic_debug动态调试3生产环境需控制日志级别3

注意:

  1. 完整驱动流程‌:设备号申请 → cdev初始化 → 实现file_operations → 注册设备 → 创建设备节点。
  2. 用户空间交互‌:通过/dev/下的文件节点调用驱动接口,内核通过file_operations转发到具体函数。

 

总结: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93394.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

★CentOS:MySQL数据备份

一、cp 命令备份特点:优点:备份恢复数据快:直接复制文件,无需进行数据转换和复杂的处理,因此备份恢复速度非常快缺点:需要停止数据库服务,灵活性差,占用空间大,可移植性差…

Python代码规范与静态检查(ruff/black/mypy + pyproject.toml + Makefile)自动化工具链介绍

文章目录**1. 核心工具的作用****(1) black:代码格式化工具****(2) ruff:代码质量检查工具****(3) mypy:静态类型检查工具****2. pyproject.toml:统一配置中心****示例配置**(pyproject.toml):*…

软件需求管理过程详解

需求管理过程需求管理是软件工程和系统开发中的核心过程,它确保项目始终围绕正确、稳定且可追溯的需求进行。在复杂系统开发中,需求往往动态变化,需求管理通过系统化的方法控制变更、维护版本、建立追溯关系,从而降低项目风险、保…

MySQL性能优化实战指南:从入门到精通的完整优化体系

MySQL性能优化实战指南:从入门到精通的完整优化体系🚀 前言:在当今数据驱动的时代,MySQL作为世界上最流行的开源关系型数据库,其性能优化能力直接决定了应用系统的响应速度和用户体验。本文将从多个维度深入探讨MySQL优…

KingbaseES主备读写分离集群安装教程

首先我们先要找数据库集群安装软件和脚本。这里我事先安装一台单机。 [rootlocalhost zip]# mkdir -p /home/kingbase/software [rootlocalhost zip]# scp -r * /home/kingbase/software/ #安装软件和脚本在单机版本的/opt/Kingbase/ES/V9/ClientTools/guitools/DeployTools/z…

electron程序适配loongArch64

一、原始项目 1.原始程序适配arm,x86国产linux设备;新增需求适配loongArch64麒麟v10sp1。 2.原始devDependencies "devDependencies": {"electron": "^17.2.0","electron-builder": "^23.0.3",}二、可能遇到的问…

窗口系统(windowing system)的架构思考

我想做一个通用窗口系统,窗口、控件等,一切都抽象成树形结构的层叠矩形块,可支持半透明、模糊等混合选项,那么每个窗口是不是需要一块存储区?我之前的代码为了计算模糊,还不止一块,要三块。那么…

极简工具箱:安卓工具箱合集

软件介绍 极简工具箱是一个安卓工具箱合集软件;软件支持安卓。 它支持将近 400 个实用功能,支持将近 40 款单机游戏,提供 140 多个实用网站导航,包括电子书导航、学习导航、设计导航、产品经理导航、大数据导航、文档格式转换、…

TOGAF八步一法笔记2

业务需求和验收标准一旦方向确定,接下来的关键就是:创建业务需求、明确验收标准当“预备阶段”完成,能力愿景和范围被管理层确认后,我们正式进入能力建设的“实施轨道”。而这个轨道的起点,是两个核心动作:…

各种读取csv文件的工具性能比较

在翻阅calamine作者的quick-csv存储库时无意中看到有个10年前的csv读取比赛, 把比赛选手源程序下载下来测试看到底有多快。 git clone https://bitbucket.org/ewanhiggs/csv-game.git这些源程序只有比赛程序本身,依赖的文件有的在主页,有的在makefile中…

HTML <iframe> 标签 如何把html写入iframe标签

标签 如何把html写入iframe标签 使用srcdoc属性 HTML iframe 标签 参考 定义和用法 <iframe> 标签定义行内框架&#xff08;内联框架&#xff09;。 行内框架用于在当前 HTML 文档中嵌入另一个文档。

Java Spark例子程序

目录spark基础&rdddocsRDDspark架构Spark 对比 hadoop MapReducespark maven依赖Spark的checkpointtransformations、shuffle、actionsreduceByKey的用法groupByKey的用法count / count distinct例子&#xff1a;单词计数例子&#xff1a;一批人员年龄数据求平均(rdd)例子&…

《代码重生:杨蓉与62.webp》

《代码重生&#xff1a;杨蓉与62.webp》2045年&#xff0c;星耀城。雨丝斜织在量子玻璃幕墙上&#xff0c;霓虹倒影如液态代码流淌。杨蓉坐在“时光回溯实验室”的终端前&#xff0c;面前悬浮着一行行泛黄的日志——那是从2018年GitHub快照中提取的原始构建记录。她指尖轻点&am…

软考 系统架构设计师系列知识点之杂项集萃(123)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(122) 第227题 某公司欲开发一种工业机器人,用来进行汽车零件的装配。公司的架构师经过分析与讨论,给出了该机器人控制软件的两种候选架构方案:闭环控制和分层结构。以下对于这两者候选框架的选择路由,错误的是(…

Sonatype Nexus Repository Manager docker版本安装

docker 网址 https://hub.docker.com/r/sonatype/nexus3 拉取镜像 docker pull sonatype/nexus3创建docker docker run -d -p 8081:8081 --name nexus --restart always sonatype/nexus3查看密码 docker exec nexus cat /nexus-data/admin.password导出docker image 镜像 …

Java Stream API:让业务数据处理更优雅

在 Java 业务开发中&#xff0c;我们经常需要对集合数据进行**筛选&#xff08;filter&#xff09;、转换&#xff08;map&#xff09;、聚合&#xff08;collect&#xff09;**等操作。比如从一批结果中过滤出符合条件的记录&#xff0c;就像这样&#xff1a; 假数据&#xf…

Win11和Win10共享打印机提示709用添加Windows凭据来解决的小方法

我们在使用共享打印机打印文件时或者添加共享打印机的时候&#xff0c;遇到了系统提示错误709的问题&#xff0c;导致打印失败、共享失败&#xff0c;如果你现在正好也遇到了这一问题&#xff0c;那么不妨来看看下面吴师傅使用过的这个方法&#xff0c;希望可以能够帮助大家有效…

【嵌入式STM32】I2C总结

I2C诞生于上世纪80年代初&#xff0c;由飞利浦&#xff08;现在的恩智浦NXP&#xff09;为解决微控制器与外围芯片之间繁琐的连接问题而设计。 仅仅两根线——SCL&#xff08;时钟线&#xff09;和SDA&#xff08;数据线&#xff09;&#xff0c;就能实现多设备间的双向通信。 …

WPF 监控CPU、内存性能

本段代码是一个封装的用户控件<UserControl x:Class"YF_Frame.PerformanceMonitor"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.…

Rust学习笔记(四)|结构体与枚举(面向对象、模式匹配)

本篇文章包含的内容1 结构体1.1 定义和初始化结构体1.2 Tuple Struct1.3 结构体方法&#xff08;Rust 面向对象&#xff09;1.4 关联函数2 枚举2.1 定义和使用枚举2.2 将数据附加到枚举的变体中2.3 Option 枚举2.4 模式匹配2.4.1 match语句2.4.2 if let语句1 结构体 1.1 定义和…