Linux系统驱动(四)自动创建设备节点
自动创建设备节点
(一)创建设备节点的机制
1. mknod
将驱动编译到内核中,在内核启动时驱动自动被安装执行
2.devfs(2.4内核)
3. udev(2.6内核至今)

- 注:hotplug — 热插拔
(二)API
1. 向上提交目录
#include <linux/device.h>
struct class * class_create(owner, name)
功能:向上提交目录
参数:@owner:THIS_MODULE 这个宏和模块安装卸载相关,并且会记录模块的引用计数值。@name:目录名
返回值:成功返回结构体指针,失败返回错误码指针
- 补:
- 通过
IS_ERR(cls)来判断是否失败。该宏定义在在cls是错误码指针时返回真,否则为假 - 当cls是错误码指针时,可以通过
PTR_ERR(cls)来获得失败返回的错误码
2. 销毁目录
#include <linux/device.h>
void class_destroy(struct class *cls)
功能:销毁向上提交目录后产生的结构体
参数:@cls:结构体指针
返回值:无
3. 向上提交创建节点的信息
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt,...)
功能:向上提交创建节点的信息
参数:@class:指向目录的句柄@parent:填写为NULL@devt:设备号 (241,0)=>(241<<20|0)MKDEV(major,minor) //将主和次设备号合成设备号MAJOR(devno); //从设备号中获取主设备号MINOR(devno); //从设备号中获取次设备号@drvdata:驱动的私有数据,一般填写为NULL。@fmt,...:创建节点的名字 "myled%d",i
返回值:成功返回结构体指针,失败返回错误码指针
- 注:
- MKDEV(ma,mi) 将主次设备号拼接成设备号
- MAJOR(devno) 从设备号中获取主设备号
- MINOR(devno) 从设备号中获取次设备号
4. 销毁节点的信息
void device_destroy(struct class *class, dev_t devt)
功能:销毁节点的信息
参数:@class:指向目录的句柄@devt:设备号 (241,0)=>(241<<20|0)
返回值:无
5. IS_ERR(cls)的实现机制
(三)使用示例
功能需求:在上一篇驱动的基础上加入自动创建设备节点,而无需使用mknod来手动创建
需求分析:
设备文件是需要在应用层的open函数就需要使用,因此在驱动中自动创建节点就必须要在mydev_open函数之前实现,因此在mydev_init函数中进行自动创建设备节点,在mydev_exit函数中进行销毁创建的设备节点
代码实现(此处只展示有修改的代码部分):
LED.c
static int __init myioctl_init(void){//入口注册设备major=register_chrdev(0,CHRNAME,&myfops); //第一个参数为0,表示由系统分配主设备号,此时返回值就是系统分配的主设备号if(major < 0){//说明出错,返回了错误码,错误码均为负数pr_err("register_chrdev error:%d\n",major);return major; //失败返回错误码}printk("major=%d\n",major);//向上提交目录mycls = class_create(THIS_MODULE,"class_name");if(IS_ERR(mycls)){//成功返回结构体指针,失败返回错误码指针//为真则说明是错误码指针pr_err("class create error:%ld\n",PTR_ERR(mycls));return PTR_ERR(mycls); //出错返回错误码}//向上提交节点信息mydev = device_create(mycls,NULL,MKDEV(major,0),NULL,"myioctl");if(IS_ERR(mydev)){//成功返回结构体指针,失败返回错误码指针//为真则说明是错误码指针pr_err("class create error:%ld\n",PTR_ERR(mydev));return PTR_ERR(mydev); //出错返回错误码}return 0; //成功返回0
}static void __exit myioctl_exit(void){//销毁节点信息device_destroy(mycls,MKDEV(major,0));//销毁目录信息class_destroy(mycls);//出口销毁设备unregister_chrdev(major,CHRNAME);
}
相关文章:
Linux系统驱动(四)自动创建设备节点
自动创建设备节点 (一)创建设备节点的机制 1. mknod 将驱动编译到内核中,在内核启动时驱动自动被安装执行 2.devfs(2.4内核) 3. udev(2.6内核至今) 注:hotplug — 热插拔 &…...
Webpack、Vite区别知多少?
前端的项目打包,我们常用的构建工具有Webpack和Vite,那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢?我们在做项目时要如何选择呢? 一、工具定义 1、Webpack:是一个强大的静态模块打包工…...
《剑指编程之巅:大学新生,以诗心驭代码》
《剑指编程之巅:大学新生,以诗心驭代码》 月华如水,洒落书窗,吾辈学子,正逢盛世,编程之术,已成必修之课。然则,编程语言如繁星点点,学习资源浩瀚如海,新生初…...
【八股文】网络基础
1.简述一下TCP和UDP的区别? 特性TCP(Transmission Control Protocol)UDP(User Datagram Protocol)连接类型面向连接,需要建立三次握手连接无连接,发送数据无需建立连接数据传输提供可靠的数据传…...
Nginx进阶-常见配置(一)
一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景: 在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,…...
九/十:C语言-扫雷游戏实现与函数递归
九:数组和函数实践:扫雷游戏 1.扫雷游戏的分析和设计 (1)扫雷游戏功能说明: 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现暂停或者退出游戏扫雷的游戏界面是9*9的格子默认随机布置10个雷可以排查雷࿱…...
【Android Studio】gradle文件、配置、版本下载、国内源(gradle版本以及gradle-plugin版本)
文章目录 AS查看gradle-plugin版本及gradle版本(图形)查看gradle-plugin版本及gradle版本(配置文件)配置文件分析解决gradle下载失败、版本错乱等问题。 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的自动化构建工具&…...
主要的软件设计模式及其在Kotlin中的实现示例
软件设计模式(Software Design Patterns)是面向对象设计中常用的解决方案,它们为常见的软件设计问题提供了一些被证明有效的解决方案。以下是一些主要的软件设计模式及其在Kotlin中的实现示例。 创建型模式(Creational Patterns&…...
FFmpeg音频重采样基本流程
目录 流程概述用到的APItipsdemo样例附录 - SwrContext结构体字段 流程概述 音频重采样的基本流程为: 申请重采样器上下文设置重采样去上下文的参数初始化重采样器申请数据存放的缓冲区空间进行重采样 注意,要先设置参数再对重采样器初始化 用到的API…...
无人机无人车固态锂电池技术详解
随着无人机和无人车技术的飞速发展,对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表,正逐步从实验室走向市场,为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池,固态锂电池在能量密度…...
ElementUI元件库在Axure中使用
一、ElementUI元件库介绍 ElementUI 是一套为开发者、UI/UX设计师和产品经理准备的基于Vue 2.0的桌面端组件库。它以其优雅的设计和丰富的组件,极大地提升了Web应用的开发效率与用户体验。ElementUI的组件设计精致且符合现代UI规范,包括按钮、表单、弹窗…...
联想M7615DNA打印机复印证件太黑的解决方法及个人建议
打印机在使用过程中,可能会出现复印的文字或图片太黑的问题,这会影响到打印或复印的效果。下面我们来了解一下这种情况的原因和解决方法;以下所述操作仅供大家参考,如有不足请大家提出宝贵意见; 证件包括:…...
【算法题】无重复字符的最长子串(滑动窗口)
目录 一、题目描述 二、解题思路 1、什么是滑动窗口算法? 2、滑动窗口一般解题模板 三、参考答案 一、题目描述 无重复字符的最长子串 给定一个字符串s ,请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s "abcabcbb"…...
Hikari连接池 最大连接数与最小空闲连接数配置多少合适?
spring:datasource: # 数据源的相关配置type: com.zaxxer.hikari.HikariDataSource # 数据源类型:HikariCPdriver-class-name: com.mysql.jdbc.Driver # mysql驱动url: jdbc:mysql://localhost:3306/t…...
【2.4 python中的基本输入和输出】
2.4 python中的基本输入和输出 在Python中,基本输入和输出是通过内置的input()函数和print()函数来实现的。这两个函数提供了与用户或其他程序进行交互的基本方式。 1. input() 函数 input() 函数用于从标准输入设备(通常是键盘)接收一行文…...
netty长连接集群方案
背景 公司某拍卖系统使用的netty服务不支持集群部署,不能进行横向扩展;并且和用户聚合服务耦合在一起,服务多节点部署不能提高拍卖性能,不能支撑更多用户使用拍卖。 目前需要改造并出一个集群的方案。 思路 因为是长连接的服务做集群,需要我们在客户端和服务器建立链接…...
Python面试题:结合Python技术,如何使用Keras进行神经网络建模
使用Keras进行神经网络建模是机器学习和深度学习领域中常用的方法之一。Keras是一个高级神经网络API,能够在TensorFlow、Theano等后端上运行,提供了简单易用的接口。下面是使用Keras进行神经网络建模的基本步骤: 安装Keras Keras是集成在Te…...
dll文件丢失怎么恢复?超简单的5个方法,1分钟搞定dll文件修复!
DLL,或称动态链接库,是一种重要的文件类型,包含了一系列用于运行几乎所有程序的指令,这些程序在win11、win10、win8和win7系统中都广泛使用。如果Windows操作系统中的dll文件丢失,您可能无法正常启动所需的程序或应用。…...
[Meachines] [Easy] Sense PFSense防火墙RCE
信息收集 IP AddressOpening Ports10.10.10.60TCP:80,443 $ nmap -p- 10.10.10.60 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http lighttpd 1.4.35 |_http-title: Did not follow redirect to https://10.10.10.60/ |_http-server-header…...
codetop标签双指针题目大全解析(C++解法),双指针刷穿地心!!!
写在前面:此篇博客是以[双指针总结]博客为基础的针对性训练,题源是codetop标签双指针近一年,频率由高到低 1.无重复字符的最长子串2.三数之和3.环形链表4.合并两个有序数组5.接雨水6.环形链表II7.删除链表的倒数第N个节点8.训练计划II9.最小覆…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
