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

  • 存儲技術原理分析
  • 敖青云著
  • 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,最終結束這個內核對象。

主站蜘蛛池模板: 公主岭市| 两当县| 鹿泉市| 泰州市| 莱州市| 禹城市| 安远县| 珠海市| 宝丰县| 奇台县| 康乐县| 洞头县| 额济纳旗| 拜泉县| 墨江| 璧山县| 丰顺县| 监利县| 勐海县| 娄烦县| 屏南县| 清河县| 赤壁市| 拉萨市| 平陆县| 潍坊市| 沙洋县| 黄山市| 仙桃市| 刚察县| 五常市| 克山县| 苏尼特左旗| 天全县| 临夏市| 卓资县| 济宁市| 丰县| 三都| 临澧县| 托克逊县|