第28课 hotplug/uevent机制

解析 ‘Hotplug’ 机制:内核如何在不关机的情况下处理 CPU、内存和 PCI 设备的在线拔插? 各位技术同仁,下午好!今天,我们将深入探讨 Linux 内核中一个既神秘又至关重要的机制——Hotplug。想象一下,在不关闭服务器的情况下,动态地增加或减少 CPU 核心、扩展内存容量,甚至更换故障的 PCI 设备。这不仅仅是科幻场景,而是现代数据中心和云计算环境中司空见惯的操作。Hotplug 机制正是这一切的幕后英雄。作为一名编程专家,我将带领大家从内核的视角,层层剖析 Hotplug 如何在不中断系统运行的前提下,优雅地处理 CPU、内存和 PCI 设备的在线插拔。 阅读详情

第28课 hotplug/uevent机制

第一节 hotplug/uevent机制的介绍

热拔插设备

先来回顾之前的按键字符设备驱动程序:
首先创建一个file_operations结构体,
在这里插入图片描述
之后在入口函数中注册该设备,然后再创建类,再在类下创建设备:
在这里插入图片描述
这里有个问题:为什么要在注册了设备之后要创建类并在类下创建一个设备呢??
这么做的目的是为了让mdev根据这些信息来创建设备节点
mdev又是如何根据提供的信息来创建设备节点的呢?
分析class_device_create()函数:
在这里插入图片描述

环境变量:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
shell环境依赖于多个文件的设置。当shell被调用时,它从两个初始文件读取命令。/etc/profile包含了系统变量,它由系统管理员维护,由系统管理员设置本地系统变量和特殊命令。普通用户的启动信息文件($HOME/.bash_project)由各用户自己维护,该文件可以被修改以实现任何特定的系统初始化。

在开发板的内核中执行env命令可以查看环境变量:
在这里插入图片描述
这些环境变量就是系统在执行相应的应用程序时所要读取的重要参数,每一个应用程序都有环境变量。
在这里插入图片描述
调用了应用程序后,应用程序(如mdev)就会根据之前设置好的环境变量来创建设备节点。(猜测)

现在来验证这里的uevent_helper是不是mdev应用程序,可以通过添加打印语句的方式来验证:
在这里插入图片描述
将上述打印语句添加至开发板Linux内核中的相应文件中:
在这里插入图片描述
在这里插入图片描述
之后重新编译内核:
在这里插入图片描述
将新编译的内核映象拷贝至网络文件系统中:
在这里插入图片描述
用新内核启动开发板并装载了之前的按键驱动程序后发现出现了很多打印语句:
在这里插入图片描述
从这里能够看出这里的uevent_helper就是mdev应用程序。但是目前这里的打印的环境变量有点问题。
在这里插入图片描述
修改后重新启动,发现在启动过程中打印出来各种环境变量:
在这里插入图片描述
在这里插入图片描述
分析:装载驱动程序后,就会根据之前分析的,进入class_device_create()函数一路执行到call_usermodehelper(argv[0], argv, envp, 0)调用uevent_helper字符串所指向(设置)的应用程序:即/sbin/mdev。之后mdev应用程序就会根据设置的一系列环境变量来创建设备节点。(猜测)
在这里插入图片描述
那到底是不是真如我们猜测的过程??
来分析busybox中mdev的源码:(以之前加载按键驱动程序为例)
在这里插入图片描述
这里的“-s”参数代表的是当系统启动时扫描/sys目录并产生/dev目录并生成各种设备节点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:sprintf(temp, “/sys%s”, env_path);的意思是将/sys+env_path输出到 temp 所指向的字符串。

这里的意思是如果action环境变量是“add”,则创建设备节点make_device().
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完整梳理:
驱动程序中在类下创建设备节点:class_device_create()—>call_usermodehelper(),这里的应用程序一般设置为/sbin/mdev,之后应用程序就会根据环境变量创建设备节点。

问题:call_usermodehelper()函数如何知道uevent_helper变量中传入的就是mdev应用程序呢??
在这里插入图片描述
启动脚本中的“echo /sbin/mdev > /proc/sys/kernel/hotplug”语句设置了uevent_helper为“/sbin/mdev”。

在出口函数中卸载驱动的时候调用class_device_unregister()函数,其中同样最终会调用到call_usermodehelper()函数最终导致应用程序mdev被调用,只不过卸载时环境变量不同,之前是add,现在变为remove,最终删除设备节点。
在这里插入图片描述

第二节 hotplug/uevent机制–修改mdev配置支持U盘自动挂载

问题:接上U盘想自动挂载怎么做??
在这里插入图片描述
可以看到/dev/sda表示整个U盘,/dev/sda1表示这个U盘的第一个分区,现在需要手动挂载U盘分区:
在这里插入图片描述
现在想达到的效果是自动挂载+自动卸载;----通过mdev工具来实现。
在busybox的mdev.c代码中可以看到,如果内核中使用了mdev配置文件mdev.conf,则在系统启动后会根据该配置文件的内容进行一些操作。
在这里插入图片描述
相反,如果没有使用配置文件,则只创建设备节点:
在这里插入图片描述
因此可以通过配置文件来达到我们想要自动挂载U盘的目的。
使用方法:在busybox工程中搜索mdev,找到一个mdev.txt文档:里面有配置文档的写法
在这里插入图片描述
mdev.conf的格式:

<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

device regex:设备的正则表达式 ,表示哪一个设备
uid:用户
gid:组ID
octal permissions:八进制权限属性,可读可写等权限
The special characters have the meaning: 
	@ Run after creating the device. //创建设备节点后运行命令
	$ Run before removing the device. //删除设备节点之前执行命令
	* Run both after creating and before removing the device.//创建设备节点之后和删除设备节点之前都运行该命令

想要实现自动挂载,就可以通过在mdev.conf中写入一条这样的指令,mdev去读该配置文件,之后会以octal permissions权限创建device设备节点,并且会执行后面command命令

正则表达式: 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。
正则表达式的一些常用规则:
在这里插入图片描述
在这里插入图片描述
[xxxx] 表示这些字符里的某一个。如[abc]表示abc中的某一个字符,[1-9]表示1-9中的某一个数字。

现在来做一个例子: 加载之前的led驱动程序:
在这里插入图片描述
可以看到所有的led设备权限都是可读可写可执行的,现在想要更改led设备的权限。
就要通过写配置文件的方式来完成:
1)首先写设备的正则表达式,用一个正则表达式来同时表示led1-3和leds。
①可以先不用正则表达式:在mdev.conf中直接罗列写出配置命令:
在这里插入图片描述
在这里插入图片描述
这时候权限已经被改写了。

② 正则表达式:
在这里插入图片描述
③ 再加入命令:装载驱动程序后执行打印命令:
在这里插入图片描述
在这里插入图片描述
在命令中又加入一段脚本,表示根据环境变量来打印不同的提示语句。

④ 将命令写入一个脚本:add_remove_led.sh,然后把该脚本放入一个目录/bin 中:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到达到了同样的效果。

⑤ U盘自动加载:
在这里插入图片描述
在这里插入图片描述
这时候看到已经成功自动挂载了。拔掉U盘后可以看到已经没有挂载信息了:
在这里插入图片描述
当然也可以把后面的命令写为sh脚本文件:
在这里插入图片描述

告别LM2596!用LM5175打造400W自动升降压数控电源(附完整电路图与代码) 本文详细介绍了如何利用LM5175芯片设计400W自动升降压数控电源,替代传统的LM2596方案。通过四开关Buck-Boost拓扑结构,LM5175实现了高达98%的转换效率和400W大功率输出,支持无缝升降压切换。文章涵盖芯片选型、电路设计、PCB布局及STM32数控实现,为工程师提供完整的实践指南。 阅读详情

相关推荐

量子计算入门指南:密度算符的核心概念与应用解析

本文深入解析了量子计算中密度算符的核心概念与应用。作为描述量子系统“状态的状态”的关键数学工具,密度算符能有效处理混合态与子系统描述,是理解量子噪声、量子纠错和开放系统演化的基石。文章通过对比纯态与混合态,阐释了密度矩阵的数学定义与物理意义,并结合代码示例演示了其在实际量子计算问题中的强大威力。

day7的博客 469

热插拔时间从内核空间到用户空间的传递过程

将可移动设备连入系统时,系统的后台中会依次发生如下事件: l         内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。 l         udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保

bingqingsuimeng的专栏 3130

Lumerical官方案例、FDTD时域有限差分法仿真学习(三)——环形谐振器(Ring resonator)之第二&第三部分

二、使用 MODE 的参数提取和蒙特卡罗 三、最终参数提取

weixin_45719141的博客 1万+

linux设备模型十二(热拔插hotplug)

我们知道,一个最简单的字符设备驱动应该是下面这个形式。 #include <linux/fs.h> #include <linux/init.h> /* 定义一个open函数 */ static int first_drv_open(struct inode *inodep, struct file *filep) { return 0; } ...

To_run_away的博客 3376

如何利用ADS中的耦合线设计带通滤波器并转换为HFSS模型

耦合线带通滤波器是一种常用的微带滤波器形式,由多个长度为四分之一波长的耦合线节组成,在所需频点形成谐振,构成滤波器的频率响应特性。首先我们先来了解一下耦合线带通滤波器的电路结构,见下图:包括两对耦合线,中间为公共连接点,其中两对耦合线的偶奇模阻抗为(Z1e,Z1o)和(Z2e,Z2o,端口输入阻抗为Z0)。2.指定一个初始奇偶模值,ADS优化出一个合适的结果,通过奇偶模值利用linecalc工具计算出微带耦合线尺寸。假设中心频率为2GHz,则对应频点的电长度为。5.运行结果,两个软件仿真结果基本一致。

auqihc的博客 2229

【MATLAB】通过计算曲率和曲率变化率来实现对曲线波浪程度

这段代码将计算给定曲线的曲率,并与给定阈值进行比较以检测拐角。函数是MATLAB中一个常用的函数,可以用于计算曲线在每个点处的曲率。它基于一种被称为“local least squares fitting” 的方法,通过拟合每个点周围的一小段曲线来计算曲率。MATLAB中可以使用多种方法实现拐角检测,其中一种方法是基于曲率半径的算法。该算法通过计算曲线上每个点处的曲率半径,找到拐角和弯曲处。是一个可选参数,用于控制拟合曲线的平滑度,取值范围为0到1,越接近1表示曲线越平滑。表示曲线在每个点处的曲率,

Fanjufei的博客 1919

pcie的hotplug概念

PCIE的hotplug操作讨论 hotplug的概念 hotplug--热插拔即“带电插拔”,指可以在电脑系统运作时插上或拔除硬件设备。配合适当的软件,便可以在不用关闭电源的情况下插入或拔除支持热插拔的周边设备,不会导致主机或周边设备烧毁并且能够实时侦测及使用新的设备。这个比即插即用(Plug-and-Play)可方便多了。 说道hot-plug那么就会想到hot-removal,这个道理

云醉月-楚狼 2万+

nvidia jetson orin调试 MAX96712 serdes相机(SG2-AR0233C-GMSL2)

背景:想了解一下关于nvidia orin camera相关的模块,基于Drive Orin demo板的话,没有合适的相机,用 nvsipl框架点亮 GMSL相机不知如何下手,那么基于nvidia Jetson orin的话,目前国内有对应的转接板以及GMSL相机可以参考,基于此,那么本文详细记录一下关于nvidia orin的相关踩坑记录;需要Nvidia Jetson Orin开发板一个,MIPI转接板一个,MIPI转GMSL转接板一个,GMSL线束(fakra单线束),GMSL摄像头一个。

qq_30025621的博客 4446

OpenWRT Hotplug原理分析

本次研究基于OpenWRT 14_07 trunk。其他版本有部分差异,请阅读时注意。即热插拔,在新版本OpenWRT上,hotplugcoldplug与watchdog等被集成到全新的Procd系统中。是OpenWRT下新的预初始化,初始化,热插拔和事件系统。在openwrt中,procd作为init进程会处理许多事情, 其中就包括hotplug。procd本身并不知道如何处理hotplug事件,也没有必要知道,因为它只实现机制,而不实现策略。事件的处理是由配置文件决定的,这些配置文件即所谓的rules。

Systemcall名屋 2596

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

CADENCE 25.1打开元件库ERRORCannot perform the operation because of an exception.

摘要:解决CADENCE25.1打开元件库报错"ERRORCannotperformtheoperationbecauseofanexception"的方法:该错误通常由软件中文设置导致。解决方案为:进入Options→Preferences→MorePreferences,取消勾选两个本地语言选项后重启软件即可恢复正常。此方法简单有效,能快速解决因语言设置导致的元件库访问异常问题。(98字)

0 1019

linux下hotplug_uevent机制(热插拔机制)及udev/mdev

linux下hotplug_uevent机制(热插拔机制)_fight_onlyfor_you的博客-优快云博客

sunxiaopengsun的专栏 510

华为OD机试 双机位A卷 - 流量波峰 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位A卷 流量波峰,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1377

详解kobject_uevent_env上报机制

在用户层,通过一个进程来创建一个netlink,这个应用程序可以是mdev,udev或者openwrt的procd,这三种方式都是基于netlink来管理热插拔的,比如procd通过NETLINK_KOBJECT_UEVENT参数来通过socket系统调用创建一个fd来与内核的netlink交互数据,内核上报uevent被这个进程接受后,然后调用/etc/hotplug.d/的各脚本来执行热插拔操作。这是热插拔触后,触发的事件给应用层,然后执行的脚本,跟上面的信息是对上的。比如插拔sim卡会打印如下信息。

我的博客 1802

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hotplug_uevent 机制

1. kobj、kset 分析: http://www.wowotech.net/device_model/421.html 2. uevent 设备模型: http://www.wowotech.net/device_model/uevent.html 3. 分析 linux3.4.xxx 内核中设备节点的创建过程: 在linux3.4.xxx中,lin...

老鹏 402

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

kobject_uevent,uevent_helper,/sys/kernel/uevent_helper,/proc/sys/kernel/hotplug

class_device_create class_device_register class_device_add kobject_uevent(&class_dev->kobj, KOBJ_ADD); kobject_uevent_env action_string = action_to_string(action); uevent_ops->fil

be happy 2231

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

hotplug_uevent机制学习笔记

1、为什么有hotplug_uevent机制 (1)查看驱动程序,以前是构造file_operation结构体。 (2)在入口函数来注册它。 (3)为什么还要创建类,为什么还要在类下创建设备,这样做是为了让mdev根据这些信息来创建设备节点 (4)分析为什么class_device_create这个函数能让mdev创建设备节点 class_device_create

qingkongyeyue的博客 2290

[Openwrt]procd实现hotplug机制介绍

uevent_helper[] 里默认指定 "/sbin/hotplug", 但可以通过 /sys/kernel/uevent_helper (kernel/ksysfs.c) 或 /proc/kernel/uevent_helper (kernel/sysctl.c) 来修改成指定的程序.在 OpenWrt 并不使用 user_helper[] 指定程序来处理 uevent (/sbin/hotplug 不存在), 而是使用 PF_NETLINK 来获取来自内核的 uevent.

l00102795的博客 1206

openwrt hotplug

由内核发出 event 事件. kobject_uevent() 产生 uevent 事件(lib/kobject_uevent.c 中), 产生的 uevent 先由 netlink_broadcast_filtered() 发出, 最后调用 uevent_helper[] 所指定的程序来处理. uevent_helper[] 里默认指定 "/sbin/hotplug", 但可以

chuanzhilong的博客 1069

hotplug/mdev机制

目录 hotplug/mdev机制 框架 kobject_uevent_env mdev_main make_device mdev.conf 配置文件学习 更改属性 @:创建设备节点之后执行命令 ...

weixin_34096182的博客 424

Linux的uevent事件机制

uevent事件机制 Linux设计了一种uevent的机制。当有新的设备加入的时候,将设备的信息发送消息到用户态。而用户态有一个udev的进程监听这个信息。当收到信息后做一定的解析,根据解析到的结果和用户程序的配置做一些处理,也包括加载驱动程序。 内核部分,Uevent是Kobject的一部分,用于在Kobject状态发生改变时,例如增加、移除等,通知用户空间程序,主要涉及kobject.h和k...

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 5703

【驱动】第11课、热拔插—hotplug_uevent机制

主 机:VMWare--Ubuntu-16.04.2-x64-100ask 开发板:Mini2440--256M NandFlash,   2M NorFlash,   64M SDRAM,   LCD-TD35;    bootlorder:u-boot1.16,      Kernel:2.6.22.6;编译器:arm-linux-gcc-3.4.5 1、问题问题1.进程...

weixin_30527323的博客 170

Linux Hotplug 机制详解

适用于旧系统或自定义处理。假设通过 /proc/sys/kernel/hotplug 调用。Bash。

ACMIII的博客 735

Linux uevent分析、用户接收uevent以及mdev分析

关键词:uevent、netlink、ADD/REMOVE/CHANGE、uevent_helper、hotplug、usermode helper、mdev、mdev.conf等等。 本文从三方面了解uevent相关内容:内核中uevent如何传送、用户空间如何处理uevent、如何通过mdev实现热插拔功能。 1. Linux uevent分析 kobject_action定义了 Li...

weixin_30663471的博客 932

hotplug_uevent机制

1、驱动部分 2、busybox

u012617366的博客 295

linux 内核uevent事件,Udev 内核机制(kobject_uevent) 性能优化

Udev 内核机制(kobject_uevent) 性能优化前言这两天遇到一些 udev 的问题, 顺便阅读了一下文档(见参考文档), 基本了解了 udev的机制。嵌入式系统性能很重要,于是对内核这一块进行了性能方面的研究。内核大概20多处会调用了 kobject_uevent 函数发送 KOBJ_ADD / KOBJ_REMOVE等事件。其中我们最关心的就是在device_add/device_...

weixin_30400859的博客 660
上一篇: 第 27 课 DMA 驱动程序
下一篇: 第30课 驱动调试
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值