Linux 字符设备驱动 之 无法归类的《杂项设备驱动》

学习目标:

了解 杂项设备驱动 和普通字符设备的异同,及杂项设备驱动程序的写法


学习内容:

一、杂项设备驱动的特别之处

        杂项设备(Miscellaneous Devices)是一种通用的设备类型,用于表示那些不适合其他设备类型的设备。这些设备通常是不规则的,没有标准的通信协议或接口。

        在Linux中,把无法归类的设备定义成杂项设备。相对于一般字符设备来说,杂项设备主设备号固定位10。而一般字符设备不管是动态分配还是静态分配设备号,都会一个区别其他类别的唯一主设备号。

        杂项设备也会和一般的字符设备一样在/dev下创建设备节点。只是在编写设备驱动时用的函数大有不同。

二、杂项设备编写

1、miscdevice 结构体

        杂项设备使用结构体miscdevice 描述,该结构体定义在 include/linux/misdevice.h 文件中。如下图所示:

        其中,次设备号minor 一般使用宏 MISC_DYNAMIC_MINOR,表示自动分配次设备号。杂项设备主要依赖次设备号来管理。

#define MISC_DYNAMIC_MINOR 255

name: 就是要告诉系统创建设备节点的名称
fops: 就是系统调用 和 驱动功能的连接桥梁,即包含设备操作的 struct file_operations 结构的指针。

2、杂项设备的注册与卸载

        注册和卸载杂项设备的函数声明在 include/linux/miscdevice.h 中,定义在drivers/char/misc.c 文件中。

注册函数 misc_register :

函数原型:int misc_register(struct miscdevice *misc);
参数:杂项设备的结构体指针
返回值:0:成功,负数:失败

卸载函数 misc_deregister:

函数原型:void misc_deregister(struct miscdevice *misc);
参数:杂项设备的结构体指针

3、代码

#include <linux/module.h>
#include <linux/init.h>#include <linux/fs.h>
#include <linux/miscdevice.h>static int my_misc_open(struct inode *inode, struct file *file)
{printk("This is my_misc_open\n");return 0;
}static ssize_t my_misc_read(struct file *file, char __user *buf, size_t size, loff_t *off)
{printk("This is my_misc_read\n");return 0;
}static ssize_t my_misc_write(struct file *file, const char __user *buf, size_t size, loff_t *off)
{printk("copy_from_user kbuf = %s\n", kbuf);return 0;
}static int my_misc_release(struct inode *inode, struct file *file)
{printk("This is my_misc_release\n");return 0;
}static struct file_operations my_misc_ops={.owner = THIS_MODULE,.open = my_misc_open,.release = my_misc_release,.read = my_misc_read,.write = my_misc_write,
};// 定义杂项设备结构体
struct miscdevice misc_dev={.minor = MISC_DYNAMIC_MINOR,.name = "my_misc",.fops = &my_misc_ops
};// 驱动入口函数
static int module_misc_init(void)
{int ret = 0;ret = misc_register(&misc_dev);if(ret < 0){printk("misc_register failed\n");return -1;}return 0;
}// 驱动卸载函数
static void module_misc_exit(void)
{misc_deregister(&misc_dev);printk("misc_deregister test module bye!\n");
}module_init(module_misc_init);
module_exit(module_misc_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("BF");
MODULE_VERSION("V1.0");

编译完成后,加载驱动,我们可以查看设备节点中是否创建了杂项设备my_misc,以及主设备号是不是之前说的10, 如图:

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

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

相关文章

基于springboot企业微信SCRM管理系统源码带本地搭建教程

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…

ubuntu 安装haproxy

####安装##### sudo apt update sudo apt install haproxy sudo haproxy -v sudo systemctl status haproxy sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org####配置站点##### nano /etc/haproxy/haproxy.cfgfrontend www-httpbind *:5001mode httpdefault_ba…

SAP RFC 的几种类型

SRFC: ARFC: ARFC: TRFC: QRFC: QRFC-QIN Scheduler: *RFC: tables: RSTRFCTA RFC-TEST: Outbound Queue: STOP/RESTART (after STOP) RSTRFCTB RFC TEST: Outbound Queue: Get/Execute LUWs from Local/Remote Syst RSTRFCTC RFC-TEST: Inbound Que…

当有违法数据时,浏览器不解析,返回了undefined,导致数据不解析

现象&#xff1a;页面上没有看到数据 排查&#xff1a;断点到线上的源码里&#xff1a;1、协议回调确实没有拿到数据是个undefined 2、network里看服务确实响应了数据 3、控制台没有任何报错。 心情&#xff1a;莫名其妙的现象 我本地有json格式化工具&#xff0c;copy进去后&…

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model

论文链接&#xff1a;Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore 总览 “Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写&#xff0c;发表于 2024 年 IEEE Symp…

linux入门之必掌握知识点

#1024程序员节&#xff5c;征文# Linux基础 top命令详解 top命令是用来查看进程系统资源使用情况的工具&#xff0c;它可以动态的现实。 top命令执行后&#xff0c;按大写M可以按内存使用情况进行排序&#xff0c;大写P可以按CPU使用情况进行排序&#xff0c;大写H可以显示线…

vue-vant框架引入

一、工具说明 vscode编辑器 二、安装 使用包管理器安装 npm install vant -S 查看是否安装成功&#xff1a;查看项目下的package.json文件中的依赖是否有vant: 三、导入 1、按需导入 按照node_mouduls目录下的vant文件夹的lib目录中的路径导入你要的组件 2、整体导入 在…

WPS电信定制版 v12.8.2.18205 自带 VBA\无广告

下载&#xff08;哪个方便就下哪个&#xff09;&#xff1a;【1】https://pan.quark.cn/s/5373bf6cdcf5【2】链接: https://pan.baidu.com/s/1Vn2Bbhp8px-BBtlalkIIYg?pwdjgry 提取码: jgry 软件介绍&#xff1a; 1、VBA 组件更换为电信定制版&#xff0c;签名日期&#xf…

【进阶OpenCV】 (19)-- Dlib库 --人脸表情识别

文章目录 表情识别一、原理二、代码实现1. 摄像头前预处理2. 计算嘴唇变化3. 绘制嘴唇轮廓4. 显示结果5. 完整代码展示 总结 表情识别 目标&#xff1a;识别人物的喜悦状态。 一、原理 我们在对一张人脸图片进行关键点定位后&#xff0c;得到每个关键点的位置&#xff1a; 比…

疯狂变现!5分钟教你如何高效率制作AI商业海报!

在这个快节奏的时代&#xff0c;效率就是生命力。无论你是创业者、还是设计师&#xff0c;制作吸引人的详情海报都是日常工作中不可或缺的一环。传统的设计从构思到定稿&#xff0c;往往需要数小时甚至数天的时间。但现在&#xff0c;有了AI技术的加持——仅5分钟&#xff0c;你…

红帽Linux认证与其他认证相比优势在哪?

在各种各样的 IT 认证里头&#xff0c;红帽 Linux 认证凭借自身独特的地方和长处崭露头角。那红帽 Linux 认证跟其他认证相比&#xff0c;长处到底在啥地方呢&#xff1f; 接下来就给大伙简单说道说道。 首先&#xff0c;红帽 Linux 认证特别注重实践。它主要考查考生实际操作…

AI智能监测系统:全面赋能燃气安全管理的智能化转型方案

燃气安全智能化的需求&#xff1a; 随着燃气供应系统的广泛应用&#xff0c;燃气安全成为城市管理和企业运营中的重要环节。由于燃气泄漏、操作不规范等事故会造成巨大的人员伤亡和财产损失&#xff0c;传统的安全管理方法往往效率低下&#xff0c;依赖人工巡检&#xff0c;无…

JavaEE----多线程(二)

文章目录 1.进程的状态2.线程的安全引入3.线程安全的问题产生原因4.synchronized关键字的引入4.1修饰代码块4.2修饰实例方法4.3修饰静态方法4.4对象头介绍4.5死锁-可重入的特性 5.关于死锁的分析总结5.1死锁的分析5.2死锁成因的必要条件5.3死锁的解决方案 1.进程的状态 public…

深入了解 kotlinx-datetime:配置与使用指南

深入了解 kotlinx-datetime&#xff1a;配置与使用指南 在Kotlin多平台开发中&#xff0c;处理日期和时间是常见的需求。kotlinx-datetime库提供了强大且简洁的API来帮助开发者应对这一挑战。本文将详细介绍如何配置kotlinx-datetime库&#xff0c;并通过生动的示例演示其核心…

java中Set,Map,List集合的比较(不包含增删改查函数方法)

目录 1. 集合的简介2. List3. Set4. Map5. 比较5.1 结构特点5.2 实现类5.3 区别 6. 其他问题6.1 集合与数组的区别6.2 哪些集合类是线程安全的 7. 参考链接 1. 集合的简介 所有的集合类和集合接口都在java.util包下。 在内存中申请一块空间用来存储数据&#xff0c;在Java中集…

[网络协议篇] UDP协议

文章目录 1. 简介2. 特点3. UDP数据报结构4. 基于UDP的应用层协议5. UDP安全性问题6. 使用udp传输数据的系统就一定不可靠吗&#xff1f;7. 基于UDP的主机探活 python实现 1. 简介 User Datagram Protocol&#xff0c;用户数据报协议&#xff0c;基于IP协议提供面向无连接的网…

毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现

1.摘要 皮肤癌是人类最常见的恶性肿瘤&#xff0c;主要通过视觉诊断进行初步临床筛查。但是由于皮肤病变外观的细微变化性&#xff0c;使用图像自动分类皮肤病变是一项具有挑战性的任务。本文为了提高深度学习算法在皮肤病检测上的准确率&#xff0c;本文提出了基于Inception和…

VoLTE 微案例:VoLTE 注册失败,I-CSCF 返回 403,HSS(UAR) 返回 5001

目录 1. 问题描述 2. 故障注册流程与正常流程对照 3. 结论 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都可以添加博主低价指导哈。 1. 问题描述

Geranium天竺葵:位置修改、守护进程管理器、清理器、屏幕时间删除器和 TrollStore 监督器

LocSim&#xff0c;TrollStore 的守护进程经理、清洁工和主管 关于 LocSim、守护进程管理器、清理器、屏幕时间删除器和 TrollStore 监督器 安装 安装Geranium需要满足以下要求&#xff1a;使用TrollStore 1.3或更高版本&#xff0c;并在iOS 15或更高版本的设备上运行。您可以从…

LearnOpenGL之3D模型加载

前序 AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;https://github.com/wangyongyao1989/AndroidLearnOpenGL 系列文章&#xff1a; 1、LearnOpenGL之入门基础 2、LearnOpenGL之3D显示 3、LearnOpenGL之摄像机 4、LearnOpenGL…