Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270477
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-03-25 14:19:43

昨天寫了一整天的 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的(這又是一篇懸疑小說了),以後有空再寫。

阅读(525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~