1. 程式人生 > >Linux上的U盤自動掛載的底層詳細過程

Linux上的U盤自動掛載的底層詳細過程

3.  udev & HAL
udev通過NetLink註冊核心的裝置事件,當有裝置插入/拔除時,udev就會收到通知,它會從事件中所帶引數和sysfs中的資訊,載入適當的驅動程式,建立dev下的結點,讓裝置處於可用的狀態。
.         udev只是一個框架,它的行為完全受它的規則所控制,這些規則存放在目錄/etc/udev/rules.d/中,其中90-hal.rules是用 來讓udev把裝置插入/拔除的事件通過socket socket:/org/freedesktop/hal/udev_event轉發給HAL的。
.         HAL掛在socket:/org/freedesktop/hal/udev_event上等待事件,有事件發生時就呼叫函式 hald_udev_data處理,它先從事件中取出主要引數,建立一個hotplug_event物件,把它放入事件佇列中,然後呼叫 hotplug_event_process_queue處理事件。
.         函式hotplug_event_begin負責具體事件的處理,它把全部事件分為四類,並分別處理 hotplug_event_begin_sysfs處理普通裝置事件,hotplug_event_begin_acpi處理ACPI事 件,hotplug_event_begin_apm處理APM事件,hotplug_event_begin_pmu處理PMU事件。要注意的是,後三 者的事件源並非源於udev,而是在device_reprobe時觸發的 (osspec_device_reprobe/hotplug_reprobe_tree /hotplug_reprobe_generate_add_events/acpi_generate_add_hotplug_event)。
.         函式hotplug_event_begin_sysfs中,如果是插入裝置,則建立一個裝置物件,設定裝置的屬性,呼叫相關callouts,然後放 入裝置列表中,並觸發signal讓dbus通知相關應用程式。如果是拔除裝置,則呼叫相關callouts,然後從裝置列表中刪除,並觸發signal 讓dbus通知相關應用程式。
.         應用程式可以主動呼叫HAL提供的DBUS介面函式,這些函式在libhal.h中有定義。應用程式也可以註冊HAL的signal,當裝置變化時,HAL通過DBUS上報事件給應用程式。
.         callout是HAL一種擴充套件方式,它在裝置插入/拔除時執行。可以在裝置資訊檔案中(/usr/share/hal目錄)指定。
.         addon也是HAL一種擴充套件方式,它與callout的不同之處在於addon往往是事件的觸發者,而不是事件的消費者。HAL的事件源主要源於 udev,而udev源於kernel的hotplug,然而有的裝置如電源裝置、磁碟裝置和特殊按鍵等,它們並不產生hotplug事件。HAL就得不 到通知,怎麼辦呢,addon就是用於支援新事件源的擴充套件方式。比如addon-acpi從/proc/acpi/event或者/var/run /acpid.socket收到事件,然後轉發成HAL事件。addon-storage檢測光碟或磁碟的狀態,並設定裝置的屬性。addon- keyboard檢測一些特殊按鍵,並觸發相應事件。
access-check/ci-tracker/ck-tracker負責許可權的檢查,裡面提到的PolicyKit/ConsoleKit不是太熟悉,有時間再看看。
簡單的說,HAL就是一個裝置
資料庫
,它管理當前系統中所有的裝置,你可以以多種靈活的方式去查詢這些裝置,可以獲取指定裝置的特性,可以註冊裝置變化事件。