- 存儲技術原理分析
- 敖青云著
- 1009字
- 2018-12-27 02:38:20
2.5 kobject編程模式
在sysfs中創建一個簡單的子目錄/sys/kernel/foo/,在這個目錄下,還創建了1個文件:value。如果往這些文件中寫入一個整數,隨后可以讀出。
kobject編程模式包括以下幾個步驟。
1.定義內核對象結構
我們將這個內核對象結構命名為foo,前面提到,應該將struct kobject作為它的一個域,此外,定義另一個整型域對應于要讀/寫的屬性。
2.定義屬性類型
由于內核對象有屬性,需要定義一個新的屬性類型foo_attribute。它以struct attribute作為一個域,show和store是對屬性的操作方法。
3.聲明屬性
接下來,我們用宏FOO_ATTR來聲明要用到的value屬性,它的訪問權限為0666,show和store回調函數實現分別為value_show和value_store,它們將對sysfs文件系統中value文件的讀/寫操作轉變為對foo_obj內核對象的value域的操作。
4.實現內核對象的sysfs操作
內核對象foo_obj的sysfs操作表(實際上是它所屬設備類型的操作表)為foo_sysfs_op,對應的show和store回調函數分別實例化為foo_attr_show和foo_attr_store。
foo_attr_show和foo_attr_store的代碼已經在前面給出。它們負責將kobject和attribute結構轉換為具體的內核對象(foo_obj)和對象屬性(foo_attribute),然后調用對象屬性的相應方法。就這個例子來講,它最終調用的是value_show和value_store函數。
5.定義內核對象釋放方法
除了sysfs操作表,對象類型還應該定義釋放內核對象的方法。對于內核對象foo_obj,釋放方法被定義為foo_release。它在內核對象的引用計數遞減到零時,釋放內核對象占用的內存空間。
6.聲明內核對象類型
為內核對象foo_obj定義專門的對象類型(foo_ktype),其中指定對象釋放方法和sysfs操作方法。我們假設這個對象類型沒有默認的對象屬性,例子中的value屬性是另外添加的。
7.封裝對象屬性添加和刪除方法
我們需要將value屬性添加到內核對象,或從內核對象刪除,當然可以直接調用sysfs_create_file和sysfs_remove_file方法。但是大多數情況下,我們選擇將這兩個方法做一層封裝。為此,定義了為具體內核對象foo_obj創建和刪除sysfs屬性的兩個輔助函數:foo_create_file和foo_remove_file,它們的代碼已經在前面給出。
8.定義對象創建和銷毀方法
在創建時,需要為內核對象分配內存,初始化內核對象并添加到sysfs樹。因為沒有為kobject指定kset和設置parent,這個內核對象將自動被放在kset下邊。
創建內核對象的方法被定義為create_foo_obj,它調用kobject_init_and_add,以foo_obj的內嵌kobject和foo_ktype為參數,并將其父對象設為kernel_kobj,這是內核中的一個全局變量,對應sysfs文件系統的目錄/sys/kernel/,最終創建一個內核對象,并添加到sysfs文件系統。
銷毀內核對象的方法被定義為destroy_foo_obj,它針對foo_obj的內嵌kboject調用kobject_put釋放內核對象的引用計數,當減到0時,最終釋放內核對象的內存空間。
9.實現模塊加載和卸載方法
最后,需要實現模塊加載和卸載方法。在模塊加載方法中調用create_foo_obj創建內核對象,開始它的生命歷程。在模塊卸載方法中調用destroy_foo_obj,最終結束這個內核對象。