Linux驱动学习笔记(十)

热插拔

1.热插拔:就是带电插拔,即允许用户在不关闭系统,不切断电源的情况下拆卸或安装硬盘,板卡等设备。热插拔是内核和用户空间之间,通过调用用户空间程序实现交互来实现的,当内核发生了某种热拔插事件时,内核就会调用用户空间的程序来实现交互。热插拔机制有devfs、udev和mdev,devfs如今已经不再使用。嵌入式设备上一般使用mdev,X86上一般用udev,当然嵌入式设备上也可以用udev,mdev是udev的简化版本。udev是基于netlink机制实现的,通过udevd守护进程监听内核发送的uevent事件来执行相应的热插拔操作。而mdev是基于uevent helper机制,内核产生的uevent会调用uevent_helper所指的用户程序medv来执行热拔插动作。

2.int kobject_uevent(struct kobject *kobj, enum kobject_action action);函数可用来在内核中向用户空间发送设备事件通知uevent,触发用户态的udev/mdev等设备管理工具响应设备状态变化,该函数执行成功返回0。其中,kobj是关联的内核对象指针,代表触发事件的设备或子系统;action是发生的事件类型,包括下图所示的几种事件:

udevadm是Linux系统中用于管理和调试udev设备管理器的核心命令行工具,它允许用户直接与udev交互,查询设备信息、触发事件、监控设备变动或调试规则。使用方法为:

例如可以使用udevadm monitor命令监听所有内核设备事件,示例如下:

kobject_uevent函数向用户态发送事件时会调用kobject_uevent_env函数,如下图:

kobject_uevent_env函数可用来发送带有环境变量数据的事件。kobject_uevent_env函数会根据事件的类型进行对应的操作,但是这一流程是借助kset来实现的(uevent是通过netlink socket发送给用户空间的应用程序的,而netlink socket是基于kset的),所以发送事件的kobject必须属于某个kset,否则会导致事件发送失败,如下图:

如上图所示,在获取到发送事件的kobject所属的kset以及该kset的事件操作uevent_ops后,kobject_uevent_env函数依次执行这些操作,如下图:

最终kobject_uevent_env函数会广播要发送的事件,以便用户空间的应用程序可以接收并处理这些事件(对应udev)。另外如果定义了CONFIG_UEVENT_HELPER则会调用用户空间的uevent_helper程序(可将其设置成mdev)来处理uevent事件,如下图:

3.kset->uevent_ops中定义了三个函数,如下图:

其中,filter函数用于过滤,即当一个kobject想要向用户空间发送uevent时,由filter函数决定这个uevent是否应该被发送;name函数用于为uevent生成一个特定的名称字符串,这个名称会被添加到uevent的环境变量中,帮助用户空间应用程序识别事件来源;uevent函数来填充或修改发送到用户空间的uevent消息中的环境变量。一个示例如下图:

4.Linux提供了多种方式实现内核和用户空间的数据交换,比如系统调用、sysfs等,但是这些通信机制均为单工通信机制。而netlink是基于socket通信机制,具有双工通信的特点,可以很好的满足内核和用户空间的数据交换。因为netlink是基于socket通信机制,所以需要在用户空间使用socket接口实现。首先介绍几个函数:

  • int socket(int domain, int type, int protocol):用于创建套接字。其中domain表示所用协议,使用netlink机制时将其设置为AF_NETLINK;type表示套接字的类型,指定通信的方式和特性,使用netlink机制时将其设置为SOCK_RAW;protocol表示套接字使用的协议,通常设置为0,让系统自动选择适当的协议,在接收uevent时可将其设置为NETLINK_KOBJECT_UEVENT;该函数调用成功返回创建的套接字对应的文件描述符,失败返回-1并设置errno
  • int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen):用于将创建的套接字与指定的地址结构绑定。其中sockfd为套接字对应的文件描述符;addr为传入参数,在接收uevent时通常使用sockaddr_nl结构体(强转为sockaddr类型),这个结构体成员包括协议族(这里应为AF_NETLINK),当前进程PID;addrlen为addr的长度;该函数绑定成功返回0,失败返回-1并设置errno
  • ssize_t recv(int sockfd, void *buf, size_t len, int flags):用于接收内核发出的uevent事件。注意与一般网络编程不同,在netlink中是不用调用listen函数的,可以直接使用recv函数进行接收。其中sockfd为套接字对应的文件描述符;buf指向接收数据的缓冲区;len指定要读取的数据的字节数;flags指定一些标志用于控制如何接收数据,通常设置为0;成功情况下该函数返回实际读取到的字节数

netlink需要在用户空间循环读取内核发来的uevent,下图是一个例子(可参考讯为Linux驱动视频第十期P5):

5.对于uevent helper机制,要想在kobject_uevent_env函数中调用用户空间的uevent_helper程序来处理uevent事件,则需要定义CONFIG_UEVENT_HELPER,并且需要定义uevent_helper的路径(即CONFIG_UEVENT_HELPER_PATH的值),如下图:

有以下几种配置方法(可参考讯为Linux驱动视频第十期P6):

  • 在编译内核时直接配置CONFIG_UEVENT_HELPER_PATH:make menuconfig打开图形化配置界面后,选中Device Drivers->Generic Driver Options->Support for uevent helper后配置path to uevent helper,即配置uevent_helper的路径(例如可将其设置为/sbin/mdev)
  • make menuconfig打开图形化配置界面后,依次选中:Device Drivers->Generic Driver Options->Support for uevent helper(这一步是打开宏定义CONFIG_UEVENT_HELPER)、File systems->Pseudo fllesystems->/proc file system support、File systems->Pseudo fllesystems-> Sysctl support(/proc/sys)、Networking support。选中上述几个配置之后,就可以通过命令echo /sbin/mdev > /sys/kernel/uevent_helper对uevent_helper进行设置,或通过命令echo /sbin/mdev > /proc/sys/kernel/hotplug对uevent_helper进行设置(这两种设置方法实际就是通过对属性文件进行读写实现的)

一个简单的mdev程序如下图所示(可参考讯为Linux驱动视频第十期P7):

需要注意的是,kobject_uevent_env函数中调用的call_usermodehelper_exec函数是一个在内核空间中调用用户空间程序的函数,该函数执行用户空间程序时,将其作为子进程运行,并将其标准输入、标准输出和标准错误输出重定向到相应的文件描迷符。因此如果在用户空间程序中使用printf打印信息,这些信息将被输出到标准输出文件描述符(文件描述符1),而不是终端。因此需要在调用call_usermodehelper_exec时将标准输出重定向到终端,这样才可以在终端上看到printf输出的信息。

6.实现U盘热插拔的几个步骤,采用udev(可参考讯为Linux驱动视频第十期P8):

  • 首先需要在编译源码时配置所使用的Linux系统支持udev,例如对于buildroot文件系统,执行make menuconfig之后将System configuration->/dev management设置为Dynamic using devtmpfs + eudev表示使用udev
  • 启动系统后在/etc/udev/rules.d/目录下创建一个001.rules文件(若没有rules.d/目录则创建),其中001表示第一个规则文件,.rules是固定后缀。向在001.rules文件写入以下内容:
    KERNEL=="sd[a-z][0-9]",SUBSYSTEM=="block",ACTION=="add",RUN+="/etc/udev/rules.d/usb/usb-add.sh %k"
    SUBSYSTEM=="block",ACTION=="remove",RUN+="/etc/udev/rules.d/usb/usb-remove.sh"
    第一行表示当新增一个usb设备,执行/etc/udev/rules.d/usb/usb-add.sh脚本文件,并传入参数sd[a-z][0-9],第二行表示当移除一个usb设备,执行/etc/udev/rules.d/usb/usb-remove.sh脚本文件
  • 分别创建/etc/udev/rules.d/usb/usb-add.sh和/etc/udev/rules.d/usb/usb-remove.sh文件,分别写入以下内容:
    #!/bin/sh/bin/mount -t vfat /dev/$1 /mnt
    sync
    #!/bin/shsync
    /bin/unmount -l /mnt

还可以在/lib/udev/rules.d/目录下创建规则文件,但是/etc/udev/rules.d/比/lib/udev/rules.d的优先级高。TF卡的udev热插拔实现方式和U盘类似,只是U盘的节点名格式为sd[a-z][0-9],而TF卡的节点名格式为mmcblk[0-9]p[0-9]。采用mdev实现U盘和TF卡的热插拔步骤与udev类似,可参考讯为Linux驱动视频第十期P10、P11。

7.USBmount是一个用于自动挂载USB存储设备的工具,它可以在Linux系统中自动挂载插入的USB存储设备并在设备拔出时自动卸载。USBmount的工作原理是通过udev监视USB设备的插拔事件,并在检测到设备插入时自动挂载设备,检测到设备拔出时自动卸载设备。USBmount不需要手动挂载或卸载USB存储设备,因此可以方便地在嵌入式系统中使用(USBmount使用方式可参考讯为Linux驱动视频第十期P12)。

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

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

相关文章

大模型应用开发第五讲:成熟度模型:从ChatGPT(L2)到未来自主Agent(L4)

大模型应用开发第五讲:成熟度模型:从ChatGPT(L2)到未来自主Agent(L4) 资料取自《大模型应用开发:动手做AI Agent 》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之…

Delphi 导入excel

Delphi导入Excel的常见方法可分为两种主流方案:基于OLE自动化操作Excel原生接口和利用第三方组件库。以下为具体实现流程及注意事项: ‌一、OLE自动化方案(推荐基础场景)‌ 该方法通过COM接口调用本地安装的Excel程序&#xff0c…

Selenium的第四天打卡——Selenium浏览器应用(完整版)

Selenium浏览器应用 目录 Selenium浏览器应用 一、浏览器操作示例代码 1.设置浏览器缩放大小 2.浏览器前进和后退 3.浏览器刷新 二、WebDriver常见方法 三、鼠标事件示例 四、键盘事件示例 五、获取断言信息 六、窗口的切换 七、关键注意事项 一、浏览器操作示例代…

PMO价值重构:从项目管理“交付机器”到“战略推手”

在数字化转型浪潮中,项目管理办公室(PMO)正经历着前所未有的角色蜕变。传统上,PMO往往被视为项目管理的“交付机器”,专注于项目的按时交付和资源分配。然而,随着企业对战略执行的重视,PMO正逐渐…

本地依赖库的版本和库依赖的版本不一致如何解决?

我用的 yarn v4 版本,所以以下教程命令都基于yarn 这里假设我报错的库名字叫 XXXXXXXX,依赖他的库叫 AAAAAAAA 排查解决思路分析: 首先查看一下 XXXXXXXX 的依赖关系,执行 yarn why XXXXXXXX 首先我们要知道 yarn 自动做了库…

SQLiteStudio - 免费开源、轻量高效,跨平台的 SQLite 数据库管理工具,代替 Navicat for SQLite

管理 SQLite 数据库就用这款软件,真的早该摒弃破解和盗版的 Navicat 了。 SQLiteStudio 是一款专注于管理 SQLite 数据库 的桌面软件,用于浏览和编辑 SQLite 数据库文件。软件的作者是来自波兰的开发者 Paweł Salawa,他是一位拥有 20 年 Ja…

DeepSeek R1-0528 新开源推理模型(免费且快速)

DeepSeek推出了新模型,但这不是R2! R1-0528是DeepSeek的最新模型,在发布仅数小时后就在开源社区获得了巨大关注。 这个悄然发布的模型DeepSeek R1-0528,已经开始与OpenAI的o3一较高下。 让我来详细介绍这次更新的新内容。 DeepSeek R1-0528 发布 DeepSeek在这次发布中采…

Opera Neon发布该公司首款“AI代理”浏览器

Opera 的浏览器产品组合今日迎来了新成员。Opera Neon 是该公司首款“AI 代理”浏览器,旨在“重新思考浏览器在代理网络中的角色”。开发人员声称,Neon 能够理解用户的意图,并利用 AI 驱动的功能将其转化为行动。 Opera Neon 由三个主要部分…

网络安全之Web渗透加解密

项目基本使用 准备环境:node.js python chrome npm install chrome-remote-interface pip install playwright playwright install chromium pip install mitmproxy ............... 第一步启动cdp.js。 第二步使用python .\cdp_load.py vue_demo,连…

【VSCode-Qt】Docker远程连接的项目UI文件在 VSCode 上无法预览

Docker远程连接的UI文件在 VSCode 上无法预览,通常是因为 VSCode 通过远程开发扩展(Remote - SSH/Docker)连接到 Docker 容器时,某些图形化功能未正确配置或支持。以下是可能原因和解决方案: 原因分析 X11 转发未配置…

【HW系列】—web组件漏洞(Strtus2和Apache Log4j2)

本文仅用于技术研究,禁止用于非法用途。 文章目录 Struts2Struts2 框架介绍Struts2 历史漏洞汇总(表格)Struts2-045 漏洞详解 Log4j2Log4j2 框架介绍Log4j2 漏洞原理1. JNDI 注入2. 利用过程 Log4j2 历史漏洞JNDILDAP 反弹 Shell 流程 Strut…

《深度关系-从建立关系到彼此信任》

陈海贤老师推荐的书,花了几个小时,感觉现在的人与人之间特别缺乏这种深度的关系,但是与一个人建立深度的关系并没有那么简单,反正至今为止,自己好像没有与任何一个人建立了这种深度的关系,那种双方高度同频…

sass基础语法

Sass(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,提供了比原生 CSS 更强大、更灵活的语法功能。它有两种语法格式: Sass(缩进语法,.sass 文件)SCSS(CSS-like 语法&am…

【JavaWeb】基本概念、web服务器、Tomcat、HTTP协议

目录 1. 基本概念1.1 基本概念1.2 web应用程序1.3 静态web1.4 动态web 2. web服务器3. tomcat详解3.1 安装3.2 启动3.3 配置3.3.1 配置启动的端口号3.3.2 配置主机的名称3.3.3 其他常用配置项日志配置数据源配置安全配置 3.4 发布一个网站 4. Http协议4.1 什么是http4.2 http的…

AI in Game,大模型能力与实时音视频技术融合,交出AI应用新答卷

随着AI的技术进步和工具普及,尤其是在这两年的跃进之后,AI在游戏行业内的应用已经逐步由理念设想推向落地实践。从蔡浩宇披露的AI新游《Whispers From The Star》到GDC上各大厂家呈现的游戏AI新亮点,我们看到了更多AI与游戏的结合方式&#x…

Android Studio 2022.2.1.20 汉化教程

查看Android Studio 版本 Android Studio Flamingo | 2022.2.1 Patch 2 下载:https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable

常见的分词算法

常见的分词方法分类如下: 类型名称说明优缺点1️⃣ 基于空格/标点Word-level以空格或标点划分,如 "Hello, world!" → ["Hello", ",", "world", "!"]✅简单,❌无法处理新词,词…

湖北理元理律师事务所观察:债务优化如何成为民生安全网

据央行2023年报告,中国家庭债务收入比达137.8%。面对债务高压,湖北理元理律师事务所的实践揭示:专业债务规划的价值不仅是减负数字,更是构建社会稳定的微观防线。 一、从“催收恐惧”到“主动管理”的转变 该所服务数据显示&…

服务器密码安全运维解决新思路:凭据管理SMS+双因素SLA认证结合的方案

引言:云服务器安全成本困局 在云计算渗透率突破60%的今天,中小企业正面临严峻的安全悖论:某权威机构数据显示,72%的云上数据泄露事件源于凭据管理不当,而传统安全解决方案的采购成本往往超过中小企业年利润的8%。这种…

Vision Transformer网络结构

0.前言 参考CSDN大佬(太阳花的小绿豆)的代码,梳理了一下vit的网络结构,代码地址如下: deep-learning-for-image-processing/pytorch_classification/vision_transformer at master WZMIAOMIAO/deep-learning-for-image-processing GitHub …