Linux设备驱动——自动创建设备节点udev机制的实现过程

创建设备文件的机制有以下下列几种:

  • mknod命令:手动创建设备节点的命令
  • devfs:可以用于创建设备节点,创建设备节点的逻辑在内核空间(内核2.4版本之前使用)
  • udev:自动创建设备节点的机制,创建设备节点的逻辑在用户空间(从内核2.6版本一直使用至今)
  • mdev:是一种轻量级的udev机制,用于一些嵌入式操作系统中

今天我们只研究udev自动创建设备节点udev的实现过程 ,具体过程如下图:

流程图:

udev是用户空间的一个应用程序,在内核空间中安装驱动时,驱动会向用户空间提供信息,向上提交目录名,在这个目录下提交设备信息,当提交信息时,后台运行的hutplug会监测 /sys/class/目录/信息  是否产生新的目录、新的信息,当产生新的信息时,hotplug会通知udev,udev会在/dev/下创建节点。

udev创建设备节点使用的API分析:

#include<linux/device.h>
1.向上提交目录信息
struct class * class_create(struct module *owner,const char *name );
功能:申请一个设备类并初始化,向上提交目录信息
参数:
owner:指向当前内核模块自身的一个模块指针,填写THIS_MODULE
name:向上提交的目录名
返回值:成功返回申请的struct class对象空间首地址,失败返回错误码指针/*在内核空间最顶层会预留4K空间,当struct class函数调用失败后函数会返回一个指向这4K空间的指针bool __must_check IS_ERR(__force const void *ptr)功能:判断指针是否指向4K预留空间参数:要判断的指针返回值:如果指着指向4K预留空间返回逻辑真,否则返回逻辑假long __must_check PTR_ERR(__force const void *ptr)功能:通过错误码指针得到错误码ex:struct class_create *cls=struct class_create(THIS_MODULE,"mycdev");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PRT_ERR(cls);     }*/2.销毁目录
void class_destroy(struct class *cls)功能:销毁目录信息
参数:cls:指向class对象的指针
返回值:无3.向上提交节点信息
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)功能:创建一个设备对象,向上提交设备节点信息
参数:
cls:向上提交目录时的到的类对象指针
parent:当前申请的对象前一个节点的地址,不知道就填 NULL
devt:设备号    主设备号<<20|次设备号/*MKDEV(主设备号,次设备号):根据主设备号和次设备号得到设备号MAJOR(dev):根据设备号获取主设备号MINOR(dev):根据设备号获取次设备号*/
dridata:申请的device对象的私有数据,填写NULL
fmt:向上提交的设备节点名
...:不定长参数   
返回值:成功返回申请到的device对象首地址,失败返回错误码指针,指向4K预留空间4.销毁设备节点信息
void device_destroy(struct class *class, dev_t devt)功能:销毁设备节点信息
参数:
class:向上提交目录时得到的类对象指针
devt:向上提交设备节点信息时提交的设备号
返回值:无

 总结起来,udev通过与内核的协作,实现了在设备插入和移除时自动创建和管理相应的设备节点。这个过程主要包括内核设备驱动程序的检测、内核事件通知、udev守护进程的规则匹配、设备节点的创建和属性设置,最后通知用户空间相关应用程序。

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

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

相关文章

Ubuntu20 安装 带cuda的opencv遇到的问题

问题1&#xff1a; CUDA 12.2 fp16 dnn 编译错误 错误 C2666: operator !: 具有类似的转换重载函数 解决&#xff1a; CUDA 12.2 fp16 dnn compilation error Issue #23893 opencv/opencv GitHub Solution: I "solved" this by using static_cast. You want …

python机器人编程——用python实现一个写字机器人

目录 一、前言二、整体框架2.1 系统构成2.2 硬件介绍2.2.1主要组成部分2.2.2机械结构2.2.3驱动及控制主板PS电机驱动原理简介: 2.2.4其余部分 2.3 机器人python程序框架2.3.1通信服务模块2.3.2消息处理模块2.3.3轨迹解析模块2.3.4机械臂逆解模块2.3.5写字板模块 三、机械臂的建…

0门槛限制!快来领取你的专属元宇宙虚拟展厅!

数字化时代中&#xff0c;元宇宙虚拟展厅仿佛成为了一种新的潮流&#xff0c;虚拟展厅的出现为我们呈现出了一个超越现实的全新世界。元宇宙虚拟展厅以其多样性、互动性、沉浸式展示为特点&#xff0c;同产品进行交互&#xff0c;创造出逼真的虚拟环境&#xff0c;为广大用户打…

【Linux学习笔记】消息队列

方法一&#xff1a; 消息队列的接口 #include "fcntl.h" #include "sys/stat.h" #include "mqueue.h"// 创建消息队列实例。name: 消息队列名称。成功返回0&#xff0c;失败返回-1&#xff0c;错误码存于error中 mqd_t mq_open(const char *na…

八股——const 关键字

1.const作用 作用&#xff1a;const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值&#xff0c;这时候没有加const关键字&#xff0c;编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…

Springboot后端跨域处理

跨域 当一台服务器资源从另一台服务器&#xff08;不同的域名或者端口&#xff09;请求一个资源或者接口&#xff0c;就会发起一个跨域HTTP请求。 同源&#xff1a;协议、域名、端口都相同 只要一个不同&#xff0c;就是跨域。 例子 请求方响应方是否跨域原因http://www.ba…

element-ui switch开关组件二次封装,添加loading效果,点击时调用接口后改变状态

先看效果&#xff1a; element-ui中的switch开关无loading属性&#xff08;在element-plus时加入了&#xff09;&#xff0c;而且点击时开关状态就会切换&#xff0c;这使得在需要调用接口后再改变开关状态变得比较麻烦。 思路&#xff1a;switch开关外包一层div&#xff0c;给…

LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

文章目录 一、题目二、题解方法一&#xff1a;完全背包问题的变体&#xff08;版本1&#xff09;方法二&#xff1a;完全背包问题变体&#xff08;版本2&#xff09; 三、拓展&#xff1a;先遍历物品后遍历背包vs先遍历背包后遍历物品先遍历物品后遍历背包&#xff08;组合问题…

NAT实验:构建复杂网络拓扑,实现互联网访问与FTP发布

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1.配置链路上各个接口的IP地址。2.在私网中配置单臂路由3.在R1和R3上配置默认路由指向公网。4.私网A通过NAPT使vlan 20和vlan 10能够使用R1的公网访问互联网。5.私网B通过在R3上配置EASY IP访问互联网。6.私网…

Docker部署EMQX

1、简介 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是轻量的 (Lightweight)、发布订阅模式 (Pu…

labelme2voc 标签重叠/覆盖问题

使用labelme自带的 labelme2voc.py转换voc数据集时可能标签重叠

Maven Helper mvn项目冲突如何解决

一般用这款插件来查看maven的依赖树。 一、安装&#xff1a; File-->setting--->Plugins--->在搜索框中填写Maven Helper然后搜索&#xff0c;单击Install按钮进行安装&#xff0c;装完重启IDE。 二、使用 当Maven Helper 插件安装成功后&#xff0c;打开项目中的p…

AMD R7 7840HS 核显 780M 性能怎么样

目录 1. 基本数据 2.性能对比 2.1对比一 2.2 对比二 3.综合 1. 基本数据 2.性能对比 2.1对比一 锐龙77840h相当于i几 答&#xff1a;类似于I7-12700H R7 7840H介于13500-13700之间。 R7 7840H是AMD锐龙旗下高性能的一款处理器&#xff0c;主要应用在主流的游戏本中。各…

GFS 分布式文件系统

1&#xff0e;GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性。 MFS 传统…

GO语言篇之发布开源软件包

GO语言篇之发布开源软件包 文章目录 GO语言篇之发布开源软件包新建仓库拉取到本地初始化项目编写代码提交代码发布引用软件包 我们写GO语言程序的时候难免会引用第三方的软件包&#xff0c;那么你知道别人是怎么发布自己的软件包吗&#xff0c;别急&#xff0c;这篇博客教你怎么…

数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法...

全文链接&#xff1a;http://tecdat.cn/?p30131 最近我们被客户要求撰写关于上海空气质量指数的研究报告。本文向大家介绍R语言对上海PM2.5等空气质量数据&#xff08;查看文末了解数据免费获取方式&#xff09;间的相关分析和预测分析&#xff0c;主要内容包括其使用实例&…

【持续更新】Linux下常用的命令脚本

mysql 备份数据库 mysqldump -u用户名 -p密码 --databases 数据库名称 > 备份文件.sql备份全部数据库 #!/bin/bash# MySQL用户名和密码 MYSQL_USER"root" MYSQL_PASSWORD"XMhmyh2019."# 备份保存路径 BACKUP_DIR"/usr/mysqlbackup"# 获取数…

Vue通过ref修改 <el-input-number> 增减按钮的样式

Vue 为一个 <el-input-number> 设置了ref为‘inputNumberRef’, 通过这个ref获取<el-input-number>组件中的增、减按钮所在的<i>标签&#xff0c;并将它们的class分别改为el-icon-plus 和 el-icon-minus。 可以通过以下代码实现&#xff1a; <template&g…

如何实现CSDN评论区粉丝幸运抽选功能:一场代码与运气的碰撞

文章目录 前言抽选规则实现思路代码实现1.获取评论数据2.过滤符合抽选规则的评论者3.获取粉丝数据4.过滤符合抽选规则的粉丝5.增加公众号留言权重6.抽选粉丝 完整的代码效果展示结语 前言 为了回馈粉丝们一直以来的的关注和支持&#xff0c;我近期开启了赠书活动&#xff0c;活…

统信UOS如何关闭防火墙

在UOS操作系统中&#xff0c;默认情况下是没有安装防火墙的。然而&#xff0c;作为保护系统安全的重要措施之一&#xff0c;安装并配置防火墙是至关重要的。UFW&#xff08;Uncomplicated Firewall&#xff09;是UOS下一个简单易用的防火墙工具。本篇博客将教你如何安装和配置U…