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子產品初始化時調用的。
這兩個函數都與我們沒有什麼關系。