2.1 configfs 和 sysfs
configfs 和 sysfs 都是基于內存的虛擬文件系統,但是它們并不相同。
對于 sysfs,當內核創建某個對象時,比如注冊一個 platform_drvier 時,它就會被注冊進 sysfs 里。它的屬性就會在 sysfs
中出現:用戶程序可以通過 readdir、read 函數讀取這些屬性,也可以通過 write 函數修改某些屬性。重點在于:sysfs
中的內容是在內核里創建、銷毀,內核控制著 sysfs 的生命周期。可以認為 sysfs 就是這些內核對象的觀察窗口。
對于 configfs,當然也需要內核驅動程序的支撐。但是操作 configfs 的啟動是用戶程序:用戶執行 mkdir
時會在內核里創建一個config_item 對象,用戶執行 rmdir 時會銷毀這個內核對象。當執行 mkdir 創建目錄時,這個 config_item
的屬性就會出現在這個目錄下。用戶程序可以執行 read、write 操作讀寫這些屬性。與 sysfs 的不同在于:configfs
中目錄、文件的生命周期由用戶程序決定。
2.2 重要結構體
掛載 configfs 文件系統后,在里面創建/刪除目錄、讀寫文件、建立鏈接文件,都會導致內核中相關函數被調用。
站在用戶的角度來說,一個文件系統里面有目錄、文件兩種對象。在 configfs 的內核實現中,對應 4 個概念。從底往上看:
configfs_attribute、configfs_bin_attribute:對應文件
configfs_attribute 對應的文件里含有的是可視化的字符串信息,它在內核里有一個結構體:
struct configfs_attribute { char *ca_name; struct module *ca_owner; umode_t
ca_mode; ssize_t (*show)(struct config_item *, char *); ssize_t (*store)(struct
config_item *, const char *, size_t); };
configfs_bin_attribute 對應的文件里含有的是二進制信息,它在內核里有一個結構體:
struct configfs_bin_attribute { struct configfs_attribute cb_attr; /* std.
attribute */ void cb_private; / for user / size_t cb_max_size; / max core
size */ ssize_t (*read)(struct config_item *, void *, size_t); ssize_t
(*write)(struct config_item *, const void *, size_t);};
讀寫文件時,會導致上述結構體里的 show/store 或者 read/write 函數被調用
文件是位于某個目錄的: config_item
config_item:configfs 中的每個對象都是 config_item,后面的 config_group、subsystem
本質上都屬于特殊的 config_item
config_group、subsystem,config_item 都對應一個目錄
跟 config_group、subsystem 對比時,config_item 這個目錄下不再有目錄
在 config_item 目錄下有屬性文件,還可以創建鏈接文件
鏈接文件的操作結構體是:config_item_type 里的 configs_item_operations
config_group:它是特殊的 config_item,它有對應一個目錄
普通的 config_item:下面不再有子目錄
config_group:下面還可以創建 config_item 或者 config_group,即:下面可以再創建子目錄
在當前目錄下操作子目錄時,對應的操作結構體是:config_item_type 里的 configs_group_operations
subsystem:它是 configfs 文件系中的最頂層
比如:/sys/kernel/config/usb_gadget、/sys/kernel/config/iio
在driversusbgadgetconfigfs.c中調用configfs_register_subsystem(&gadget_subsys)就會創建
subsystem,它對應 configfs 文件系統中的頂層目錄usb_gadget
subsystem 也屬于 config_group
2.3 configfs 使用流程
跟 legacy 方法類比,要做的事情是一樣的:
創建 usb_composite_dev
設置設備描述符
設置配置描述符
添加接口(功能)
-
嵌入式
+關注
關注
5082文章
19111瀏覽量
304845 -
Linux
+關注
關注
87文章
11296瀏覽量
209353 -
函數
+關注
關注
3文章
4329瀏覽量
62575
發布評論請先 登錄
相關推薦
評論