初識Linux裝置驅動模型與sysfs(1)

來源:互聯網
上載者:User

1 sysfs 是什麼
”sysfs is a ram-based filesystem initially based on ramfs. It provides a means
to export kernel data structures, their attributes, and the linkages between them to userspace.“ --sysfs.txt
一種虛擬基於記憶體的檔案系統,
除了與 proc 相同的具有查看和設定核心參數功能之外,更重要的是為 Linux 統一裝置模型作為管理之用。

新設計的核心機制應該盡量使用 sysfs 機制,而將 proc 保留給純淨的“進程檔案系統”。
sysfs 檔案系統總是被掛載在 /sys 掛載點上。

2 /sys檔案系統的目錄
/sys 目錄下有 block, bus, , devices, firmware, fs, kernel, module, power 等,
這些目錄展示了核心對各種裝置進行統一管理的模型和方式。
/sys/devices   
這是核心對系統中所有裝置的分層次表達模型,也是 /sys 檔案系統管理裝置的最重要的目錄結構。

/sys/dev
這個目錄下維護一個按字元裝置和塊裝置的主次號碼(major:minor)連結到真實的裝置(/sys/devices下)的符號連結檔案。

/sys/bus   
核心裝置按匯流排類型分層放置的目錄結構, devices 中的所有裝置都是串連於某種匯流排之下,在這裡的每一種具體匯流排之下可以找到每一個具體裝置的符號連結.

/sys/class   
這是按照裝置功能分類的裝置模型,如系統所有輸入裝置都會出現在 /sys/class/input 之下,而不論它們是以何種匯流排串連到系統。

/sys/block   
系統中當前所有的塊裝置所在
(有資料說, 在 2.6.26 核心中已正式移到 /sys/class/block, 舊的介面 /sys/block 為了向後相容保留存在,但其中的內容已經變為指向它們在 /sys/devices/ 中真實裝置的符號連結檔案,但好像不對)

/sys/firmware   
系統載入韌體機制的對使用者空間的介面

/sys/fs   
這裡按照設計是用於描述系統中所有檔案系統,包括檔案系統本身和按檔案系統分類存放的已掛載點,但目前只有 fuse,gfs2 等少數檔案系統支援 sysfs 介面,一些傳統的虛擬檔案系統(VFS)層次控制參數仍然在 sysctl (/proc/sys/fs) 介面中中;

/sys/kernel   
這裡是核心所有可調整參數的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等幾項較新的設計在使用它,其它核心可調整參數仍然位於 sysctl (/proc/sys/kernel) 介面中 ;

/sys/module   
這裡有系統中所有模組的資訊,不論這些模組是以內聯(inlined)方式編譯到核心映像檔案(vmlinuz)中還是編譯為外部模組(ko檔案),都可能會出現在 /sys/module 中:

    * 編譯為外部模組(ko檔案)在載入後會出現對應的 /sys/module/<module_name>/, 並且在這個目錄下會出現一些屬性檔案和屬性目錄來表示此外部模組的一些資訊,如版本號碼、載入狀態、所提供的驅動程式等;
    * 編譯為內聯方式的模組則只在當它有非0屬性的模組參數時會出現對應的 /sys/module/<module_name>, 這些模組的可用參數會出現在 /sys/modules/<modname>/parameters/<param_name> 中,
          o 如 /sys/module/printk/parameters/time 這個可讀寫參數控制著內聯模組 printk 在列印核心訊息時是否加上時間首碼;
          o 所有內聯模組的參數也可以由 "<module_name>.<param_name>=<value>" 的形式寫在核心啟動參數上,如啟動核心時加上參數 "printk.time=1" 與 向 "/sys/module/printk/parameters/time" 寫入1的效果相同;
    * 沒有非0屬性參數的內聯模組不會出現於此。

/sys/power   
這裡是系統中電源選項,這個目錄下有幾個屬性檔案可以用於控制整個機器的電源狀態,如可以向其中寫入控制命令讓機器關機、重啟等。


sysfs的底層結構 kset、kobj
Linux 統一裝置模型的基本結構主要為:
1 裝置  2 裝置驅動   3 匯流排類型   4 裝置類別  

-裝置(Devices)
裝置是此模型中最基本的類型,以裝置本身的串連按層次組織,對應於核心的struct device資料結構,位於/sys/devices
-裝置驅動(Device Drivers)
為裝置提供驅動支援,管理驅動程式,對應於核心中的struct device_driver資料結構
-匯流排類型(Bus Types)  
在整個匯流排層級對此匯流排上串連的所有裝置進行管理,核心struct bus_type資料結構 位於/sys/bus/
-裝置類別(Device Classes)
這是按照功能進行分類組織的裝置層次樹;如 USB 介面和 PS/2 介面的滑鼠都是輸入裝置,都會出現在/sys/class/input/ 下
當向系統添加一個/種裝置的裝置驅動時,需要定義相應的匯流排類型(struct bus_type)和裝置類型(struct device),並調用提供的函數進行相應的註冊(bus_register(), device_register())、初始化等。

而Linux 統一裝置模型以kset和kobject兩種基本資料結構進行樹型和鏈表型結構來組織以上單元:

kobject: 在 Linux 裝置模型中最基本的對象,bus,devices, drivers等通過kobject串連起來,形成了一個樹狀結構,這個樹狀結構就與/sys向對應。
kobject 結構為一些大的資料結構和子系統提供了基本的對象管理,避免了類似機能的重複實現。這些機能包括
- 對象引用計數.
- 維護對象鏈表(集合).
- 對象上鎖.
- 在使用者空間的表示.

struct kobject {
const char *name;
struct list_head entry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct sysfs_dirent *sd;
struct kref kref;
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
};

其中 struct kref 內含一個 atomic_t 類型用於引用計數, parent 是單個指向父節點的指標, entry 用於父 kset 以鏈表頭結構將 kobject 結構維護成雙向鏈表;

 kset: 它用來對同類型對象提供一個封裝集合,在核心資料結構上它也是由內嵌一個 kboject 實現,因而它同時也是一個 kobject (物件導向 OOP 概念中的繼承關係) ,具有 kobject 的全部功能;

struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
struct kset_uevent_ops *uevent_ops;
};

其中的 struct list_head list 用於將集合中的 kobject 按 struct list_head entry 維護成雙向鏈表;

kset與kobj相互包含,Kobject通過kset組織成層次化的結構,kset是具有相同類型的kobject的集合,更多的是一種組合關係,用組合的方式來實現物件導向的思想,而不是繼承。這樣理解對不?

那麼,疑問是,為什麼要通過紛繁複雜的串連來實現這樣一個裝置驅動模型呢??

參考文章:

使用 /sys 檔案系統訪問 Linux 核心
Linux那些事兒之我是Sysfs

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.