歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux熱插拔處理機制

Linux熱插拔處理機制

日期:2017/2/28 16:17:59   编辑:Linux教程

一、 udev

在2.6內核裡,使用了udev來取代hotplug。據udev的作者Greg K.H說,之所以廢棄了hotplug原因是sysfs的出現,這個東西會產生非常多的hotplug事件,遠遠超過了2.4的內核(只要實現了了kobject模型的設備驅動都回產生該事件)。所以hotplug變得復雜,而且因為hotplug都是bash所寫,所以開始變得沒有效率。於是出現了一個名叫hotplug-ng的項目,就是為了解決這個過於復雜以及缺乏效率的問題,ng應該是next generation的意思。但這個項目目前為止還不能勝任角色,所以udev挺身而出,充當了救火隊員。

2.6.15之後,/proc/sys/kernel/hotplug會成空的,因為內核通知用戶空間的接口變成了netlink,所以最新的udev也采用了netlink接口去寫,廢棄了/sbin/hotplug或者/sbin/udevsend。udev在2.6.15以後的內核上可以直接通過netlink接聽設備事件,sysfs提供了uevent文件,對該文件的“寫”可以送出設備事件!

udev 完全在用戶態 (userspace) 工作,利用設備加入或移除時內核所發送的hotplug 事件 (event) 來工作。關於設備的詳細信息是由內核輸出 (export) 到位於 /sys 的 sysfs 文件系統的。所有的設備命名策略、權限控制和事件處理都是在用戶態下完成的。與此相反,devfs 是作為內核的一部分工作的。

傳統上一般 Linux 系統使用創建靜態設備的方法,因此在 /dev 目錄下創建了大量的設備節點(有時會有數千個節點),而不管對應的硬件設備實際上是否存在。這通常是由 MAKEDEV 腳本完成的,這個腳本包含許多調用 mknod 程序的命令,為這個世界上可能存在的每個設備創建相應的主設備號和次設備號。而使用 udev 方式的時候,只有被內核檢測到的設備才為其創建設備節點。因為每次系統啟動的時候都要重新創建這些設備節點,所以它們被存儲在 tmpfs 文件系統上,設備節點不需要很多磁盤空間,所占用的內存可以忽略不計。

udev 初始化腳本負責在 Linux 啟動的時候創建設備節點,該腳本首先將 /sbin/udevsend 注冊為熱插拔事件處理程序。熱插拔事件(隨後將討論)本不應該在這個階段發生,注冊 udev 只是為了以防萬一。然後 udevstart 遍歷 /sys 文件系統,並在 /dev 目錄下創建符合描述的設備。例如,/sys/class/tty/vcs/dev 裡含有"7:0"字符串,udevstart 就根據這個字符串創建主設備號為 7 、次設備號為 0 的 /dev/vcs 設備。udevstart 創建的每個設備的名字和權限由 /etc/udev/rules.d/ 目錄下的文件指定的規則來設置。如果 udev 找不到所創建設備的權限文件,就將其權限設置為缺省的 660 ,所有者為 root:root 。上面的步驟完成後,那些已經存在並且已經內建驅動的設備就可以使用了。

對於以模塊驅動的設備,當內核檢測到一個新設備連接時,內核會產生一個熱插拔事件,並在 /proc/sys/kernel/hotplug 文件裡查找處理設備連接的用戶空間程序(新的內核通知接口改變,/proc/sys/kernel/hotplug為空了)。udev
初始化腳本將 udevsend
注冊為該處理程序。當產生熱插拔事件的時候,內核讓 udev 在 /sys 文件系統裡檢測與新設備的有關信息,並為新設備在 /dev 裡創建項目。

所有在 sysfs 中顯示的設備都可以由 udev 來創建節點。如果內核中增加了其它設備的支持,udev 也就自動地可以為它們工作了。

大多數 Linux 發行版通過 /etc/modules.conf 配置文件來處理模塊加載,對某個設備節點的訪問導致相應的內核模塊被加載。對 udev 這個方法就行不通,因為在模塊加載前,設備節點根本不存在。Linux 的設計是在設備被發現的時候加載模塊,而不是當它被訪問的時候。通過在 /etc/sysconfig/modules文件裡添加模塊名,就可以在系統啟動的時候加載這些模塊,這樣 udev
就可以檢測到設備,並創建相應的設備節點了。

如何寫udev規則。通過udevinfo程序來找到那些可以作為規則文件裡的匹配項的項目。分為兩種情況:第一種情況是,當你把設備插入系統後,系統為設備產生了設備名(如/dev/sda)。那樣的話,你先用udevinfo -q path -n /dev/sda,命令會產生一個該設備名對應的在sysfs下的路徑,如/block/sda。然後,你再用udevinfo -a -p /sys/block/sda,這個命令會顯示一堆信息,信息分成很多塊。這些信息實際來自於操作系統維護的sysfs鏈表,不同的塊對應不同的路徑。你就可以用這些信息來作為udev規則文件中的匹配項。但需要注意的是,www.linuxidc.com同一個規則只能使用同一塊中顯示的信息,不能跨塊書寫規則;第二種情況是,不知道系統產生的設備名,那就只有到/sys目錄下去逐個目錄查找了,反復用udevinfo -a -p /sys/path...這個命令看信息,如果對應的信息是這個設備的,那就恭喜你。否則就再換個目錄。當然,在這種情況下,成功的可能性比較小。

二、 HAL

HAL位於設備驅動程序和應用程序之間。

三、 D-BUS

D-BUS 是一個大有前途的消息總線和活動系統,正開始深入地滲透到 Linux 桌面之中。D-BUS 本質上是進程間通信(inter-process communication)(IPC)的一個實現,設計用於桌面應用程序和 OS 通信。

典型的 D-BUS 設置將由幾個總線構成。一個持久的系統總線(system bus),它在引導時就會啟動。這個總線由操作系統和後台進程使用,安全性非常好,以使得任意的應用程序不能欺騙系統事件。還將有很多會話總線(session buses),這些總線當用戶登錄後啟動,屬於那個用戶私有。

一個更為有趣但很不實用的例子是 Jamboree 和 Ringaling 的結合。Jamboree 是一個簡單的音樂播放器,它具有 D-BUS 接口,以使得它可以被告知播放、到下一首歌、改變音量等等。Ringaling 是一個小程序,它打開 /dev/ttyS0(一個串行端口)並觀察接收到的內容。當 Ringaling 發現文本“RING”時,就通過 D-BUS 告知 Jamboree 減小音量。最終的結果是,如果您的計算機上插入了一個調制解調器,而且電話鈴響,則音樂音量就會為您減小。
這正是計算機所追求的!

四、 一些查看硬件信息的工具

lspci
列出所有PCI 設備。有兩個參數是比較常用,-b 和-v,lspci也會把usb接口列出來。

lshal 列出系統硬件設備。

Usbmodules
列出可用於已插入usb設備的驅動模塊。

Copyright © Linux教程網 All Rights Reserved