天天看點

sysfs API總結

    sysfs是表現裝置驅動模型的檔案系統,它的目錄層次實際反映的是對象的層次。為了配合這種目錄,linux專門提供了兩個結構作為sysfs的骨架,它們就是struct kobject和struct kset。我們知道,sysfs是完全虛拟的,它的每個目錄其實都對應着一個kobject,要想知道這個目錄下有哪些子目錄,就要用到kset。從面向對象的角度來講,kset繼承了kobject的功能,既可以表示sysfs中的一個目錄,還可以包含下層目錄。對于kobject和kset,會在其它文章中專門分析到,這裡簡單描述隻是為了更好地介紹sysfs提供的API。

    sysfs子產品提供給外界的接口完全展現在include/linux/sysfs.h中。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. struct
2. const char
3. struct
4.     mode_t          mode;  
5. };  
6.   
7. struct
8. const char
9. struct
10. struct attribute *, int);  
11. struct
12. };      

之前說過普通檔案是kobject目錄的屬性展現。struct attribute就是屬性的通用結構,其它部分在使用時還可以把struct attribute内嵌到更大的屬性結構中。struct attribute_group是提供一組屬性的集合,這樣集中的管理更為友善。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
 
1. #define __ATTR(_name,_mode,_show,_store) { \
2.     .attr = {.name = __stringify(_name), .mode = _mode },   \  
3.     .show   = _show,                    \  
4.     .store  = _store,                   \  
5. }  
6.   
7. #define __ATTR_RO(_name) { \
8.     .attr   = { .name = __stringify(_name), .mode = 0444 }, \  
9.     .show   = _name##_show,                 \  
10. }  
11.   
12. #define __ATTR_NULL { .attr = { .name = NULL } }
13.   
14. #define attr_name(_attr) (_attr).attr.name      

以上的宏是為了靜态初始化屬性時更為友善,我們簡單将其忽略。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. struct
2. struct
3. size_t
4. void            *private;  
5. struct kobject *, struct
6. char *, loff_t, size_t);  
7. struct kobject *, struct
8. char *, loff_t, size_t);  
9. int (*mmap)(struct kobject *, struct
10. struct
11. };      

struct attribute是通用的屬性結構,而struct bin_attribute就是為二進制屬性專門設計的,它在sysfs中表現為二進制檔案,大多數是裝置配置參數的映射。struct bin_attribute恰恰就是把struct attribute内嵌到更大結構的樣例。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. struct
2. struct kobject *, struct attribute *,char
3. struct kobject *,struct attribute *,const char *, size_t);  
4. };      

struct sysfs_ops中包含show和store兩個函數指針,它們分别在sysfs檔案讀和檔案寫時調用。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void
2. void *data, struct      

sysfs_schedule_callback()會建立一個工作隊列,稍後調用func(data)。本來sysfs中的屬性讀寫函數是無法删除屬性檔案或者kobject目錄的,因為調用函數時是加鎖的,要删除也需要加鎖。但這裡可以通過工作隊列回調的方式實作。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. int __must_check sysfs_create_dir(struct
2. void sysfs_remove_dir(struct
3. int __must_check sysfs_rename_dir(struct kobject *kobj, const char
4. int __must_check sysfs_move_dir(struct
5. struct      

sysfs_create_dir()建立一個kobject對應的目錄,目錄名就是kobj->name。

sysfs_remove_dir()删除kobj對應的目錄。删除一個目錄也會相應地删除目錄下的檔案及子目錄。

sysfs_rename_dir()修改kobj對應目錄的名稱。

sysfs_move_dir()将kobj對應的目錄移到new_parent_kobj對應的目錄下。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. int __must_check sysfs_create_file(struct
2. const struct
3. int __must_check sysfs_chmod_file(struct kobject *kobj, struct
4.                   mode_t mode);  
5. void sysfs_remove_file(struct kobject *kobj, const struct      

sysfs_create_file()在kobj對應的目錄下建立attr對應的屬性檔案。

sysfs_chmod_file()修改attr對應的屬性檔案的讀寫權限。

sysfs_remove_file()在kobj對應的目錄下删除attr對應的屬性檔案。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​ 
1. int __must_check sysfs_create_bin_file(struct
2. struct
3. void sysfs_remove_bin_file(struct kobject *kobj, struct      

sysfs_create_bin_file()在kobj目錄下建立attr對應的二進制屬性檔案。

sysfs_remove_bin_file()在kobj目錄下删除attr對應的二進制屬性檔案。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. int __must_check sysfs_create_link(struct kobject *kobj, struct
2. const char
3. int __must_check sysfs_create_link_nowarn(struct
4. struct
5. const char
6. void sysfs_remove_link(struct kobject *kobj, const char      

sysfs_create_link()在kobj目錄下建立指向target目錄的軟連結,name為軟連結檔案名稱。

sysfs_create_link_nowarn()與sysfs_create_link()功能相同,隻是在軟連結檔案已存在時不會出現警告。

sysfs_remove_link()删除kobj目錄下名為name的軟連結檔案。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. int __must_check sysfs_create_group(struct
2. const struct
3. int sysfs_update_group(struct
4. const struct
5. void sysfs_remove_group(struct
6. const struct
7. int sysfs_add_file_to_group(struct
8. const struct attribute *attr, const char
9. void sysfs_remove_file_from_group(struct
10. const struct attribute *attr, const char      

sysfs_create_group()在kobj目錄下建立一個屬性集合,并顯示集合中的屬性檔案。如果檔案已存在,會報錯。

sysfs_update_group()在kobj目錄下建立一個屬性集合,并顯示集合中的屬性檔案。檔案已存在也不會報錯。sysfs_update_group()也用于group改動影響到檔案顯示時調用。

sysfs_remove_group()在kobj目錄下删除一個屬性集合,并删除集合中的屬性檔案。

sysfs_add_file_to_group()将一個屬性attr加入kobj目錄下已存在的的屬性集合group。

sysfs_remove_file_from_group()将屬性attr從kobj目錄下的屬性集合group中删除。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. void sysfs_notify(struct kobject *kobj, const char *dir, const char
2. void sysfs_notify_dirent(struct      

sysfs_notify()和sysfs_notify_dirent()都是用來喚醒在屬性檔案上調用select()或poll()而阻塞的使用者程序。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
 
1. struct sysfs_dirent *sysfs_get_dirent(struct
2. const unsigned char
3. struct sysfs_dirent *sysfs_get(struct
4. void sysfs_put(struct      

sysfs_get()增加目錄或檔案的引用計數。

sysfs_put()減少目錄或檔案的引用計數,并在降為零時删除相應的檔案或目錄,這種删除又會減少上層目錄的引用計數。

sysfs_get_dirent()是增加目錄parent_sd中名為name的目錄或檔案的引用計數。

雖然同樣是引用計數,同樣在降為零時有删除動作,但卻并非使用kref。這種操作更多地繼承了檔案系統管理時的傳統。

[cpp] 
   ​​ view plain​​
   ​​copy​​
   ​​print​​
   ​​?​​
1. void sysfs_printk_last_file(void);  
2. int __must_check sysfs_init(void);      

sysfs_printk_last_file()是在sysfs崩潰時列印最後一個通路到的檔案路徑。

sysfs_init()是在sysfs子產品初始化時調用的。

這兩個函數都與我們沒有什麼關系。