官术网_书友最值得收藏!

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,最終結束這個內核對象。

主站蜘蛛池模板: 锡林浩特市| 吴忠市| 洛川县| 错那县| 积石山| 平原县| 都江堰市| 镇巴县| 安仁县| 南康市| 沁源县| 武邑县| 乌鲁木齐县| 临猗县| 邳州市| 寻乌县| 湟中县| 德兴市| 三都| 隆子县| 容城县| 钟祥市| 江阴市| 成都市| 阿克陶县| 平乐县| 廊坊市| 开封县| 瓮安县| 天水市| 永修县| 张北县| 增城市| 平舆县| 定安县| 嵩明县| 丁青县| 关岭| 屏东县| 秦安县| 裕民县|