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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84995.shtml
英文地址,請注明出處:http://en.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 …