October 20, 2006

總算有點了解 sysfs 了

昨天寫了一整天的 sysfs 的 code,因為我一直想要把這個東西搞清楚。但過程真的滿辛苦的,因為文件並不是很多,所以我一氣之下,決定直接看 sysfs.h, kobject.h, device.h, sysdev.h 來找 sysfs 提供的 API。

我 trace 的程式是 cpufreq,推薦一下這個程式,裡面有完整的 kobject initial、如何套到一個 sys_device 上、ktype的宣告等。裡面也有一些不錯的寫程式技巧,減低了重覆宣告 kyte 的 attribute 和 ops(這些技巧在kernel code中常出現,想必是不錯的撰寫風格),想了解 sysfs 的話,我想 cpufreq 算是不錯的範例格式。

果然皇天不負苦心人,更清楚了解 kobject, ktype, kset, sub-system, attribute 的用處。


    kobject: 最小的 device model unit。單純地宣告一個 kobject 並沒什麼用處,他最神奇的地方是內嵌在 Kernel 的 device 資料結構中,例如 character device(cdev), block device(blkdev)。這些資料結構中都會內嵌一個 kobject,所以,您知道知道做了吧 :-)


    ktype: kobject 的集合。但它比較偏向收集相同 operation 的 kobject 的一個集合,也就是說它是負責管理這一群 kobjects 的 operation. (show,store)。kobject 會利用它了辨識自已是屬於那一個類型,然後在 /sys 下建立正確的目錄位置。


    kset: kobject 的集合。這也是一個集合,不同於ktype,它不管理 kobject 的 ops,最重要的是建立上層(sub-system)和下層的(kobject)的關聯性。kobject 也會利用它了辨識自已是屬於那一個類型,然後在 /sys 下建立正確的目錄位置。而 kset 的優先權比較高,kobject 會利用自已的 *kset 找到自已所屬的kset,並把 *ktype 指定成該kset下的ktype,當然,你也是可以搞鬼,設定了kset,但用不同的ktype的operation(...有些code是這樣)。除非沒有定義kset,才會用 ktype 來建立關聯。


    subsystem:如果說 kset 是管理 kobject 的集合,同理、sussystem 就是管理 kset 的集合。


    attribute: 建立了 kobject 並成功註冊之後,你會發現出現該 kobj 對應的目錄竟然是空的(這是當然的啦 XD),要如何產生資訊檔案,就是利用 attribute 這個資料結構。
    struct attribute {
    char *name; // 以該變數為檔名出現在 kobj 的目錄下
    struct module *owner; // THIS_MODULE
    mode_t mode; //permission, "S_IRUGO" or "S_IWUSR" or "0660"
    };
    應該是的出來 attribute 的功用,建立好attribute之後,讀取/寫入該檔案會呼叫 ktype 對應的 operation.

至於動態建立 node 並非 sysfs 的工作(still depends on him), 是由 hotplug 接收 kset 中的hotplug ops 來傳送信號並傳送給 udev 來建立 device node的(這又是一篇懸疑小說了),以後有空再寫。

Posted by asho at October 20, 2006 10:07 AM
Comments
Post a comment









Remember personal info?