sysfs 檔案系統
linux 2.6 核心中引入了 sysfs 檔案系統,是使用者空間與核心空間進行互動的一個媒介。比起古老的 proc 檔案系統,它是基於核心的資料結構,因此組織圖上更加嚴密。它的設計使核心的資訊更易擷取,而且更加清晰。核心空間與使用者空間的映射關係如下表所示:
| 核心空間(internel) |
使用者空間(externel) |
核心對象 (kernel objects) |
目錄 (directories) |
對象屬性 (object attributes) |
普通檔案 (regular files) |
對象關係 (object relationshiops) |
符號連結 (symbolic links) |
驅動 就溫度感應器來說,驅動程式可以用核心 sysfs 檔案系統提供的介面建立對應的溫度感應器的目錄結構。應用程式通過訪問對應目錄下的普通檔案,即可擷取相應的溫度感應器屬性值。 可以仿照 linux 2.6 核心提供的 kobject-example.c ( 位於 <linux src>/samples/kobject/kobject-example.c ) 建立一個溫度感應器的提供者。比如可以在驅動中,使用 temperature作為 /sys/kernel/ 目錄下的溫度感應器對象目錄,並在這個目錄下建立一個叫 temp 的檔案,即作為溫度感應器的一個屬性,和一個mode檔案,提供溫度感應器的工作模式。 根據以上說明,我們的溫度感應器驅動需要在模組初始化中,使用語句
temp_kobj = kobject_create_and_add(“temperature”, kernel_kobj) 建立 temperature 目錄,然後利用
sysfs_create_group( temp_kobj, &attr_group ) 建立 temperature 目錄下的屬性檔案組( 這裡包含 temp 和 mode 兩個檔案 ),其中 attr_group 是我們自己定義的屬性相關檔案,通過它,我們描述了 temperature 目錄裡具有的屬性檔案,以及各檔案的 show 和 store 函數。對於本例來說,可用一個屬性數組 attrs 描述這一屬性群組 attr_group。attrs 數組包此處包含兩個元素,分別對應 temp 和 mode 檔案。這裡僅就 temp
檔案給出說明。temp 檔案的 temp_show 提供了應用程式訪問該檔案的底層方法,為了類比變化的溫度,應用程式每讀一次 temp 檔案,我們就隨機的改變溫度。所以,在 temp_show 方法裡,使用了 linux 提供的 get_random_bytes 函數產生隨機數(包含在標頭檔 linux/random.h 中)。temp_show 雷根據模式的不同,提供了擷取單時點溫度和平均溫度的兩種方法。 HAL介面測試 驅動載入後,我們就可以看到 sysfs 檔案系統中多出了 /sys/kernel/temperature/ 這一目錄,且目錄下邊有個檔案 temp, 我們可以使用 cat /sys/kernel/temperature/temp 讀取它的值,於是這一檔案就為應用程式訪問溫度感應器驅動提供了上層的通用介面。 在測試程式 test_temp.c 裡,通過開啟 /sys/kernel/temperature/temp 檔案,並每隔一秒讀取一次檔案內容( 註:每讀一次應使用 lseek 函數將檔案指標移到開頭
)。開啟 /sys/kernel/temperature/mode 查看和設定模式。編譯後在命令列中運行:./test_temp,測試結果如所示: