2.1 configfs 和 sysfs
configfs 和 sysfs 都是基于內(nèi)存的虛擬文件系統(tǒng),但是它們并不相同。
對于 sysfs,當(dāng)內(nèi)核創(chuàng)建某個對象時,比如注冊一個 platform_drvier 時,它就會被注冊進(jìn) sysfs 里。它的屬性就會在 sysfs
中出現(xiàn):用戶程序可以通過 readdir、read 函數(shù)讀取這些屬性,也可以通過 write 函數(shù)修改某些屬性。重點(diǎn)在于:sysfs
中的內(nèi)容是在內(nèi)核里創(chuàng)建、銷毀,內(nèi)核控制著 sysfs 的生命周期??梢哉J(rèn)為 sysfs 就是這些內(nèi)核對象的觀察窗口。
對于 configfs,當(dāng)然也需要內(nèi)核驅(qū)動程序的支撐。但是操作 configfs 的啟動是用戶程序:用戶執(zhí)行 mkdir
時會在內(nèi)核里創(chuàng)建一個config_item 對象,用戶執(zhí)行 rmdir 時會銷毀這個內(nèi)核對象。當(dāng)執(zhí)行 mkdir 創(chuàng)建目錄時,這個 config_item
的屬性就會出現(xiàn)在這個目錄下。用戶程序可以執(zhí)行 read、write 操作讀寫這些屬性。與 sysfs 的不同在于:configfs
中目錄、文件的生命周期由用戶程序決定。
2.2 重要結(jié)構(gòu)體
掛載 configfs 文件系統(tǒng)后,在里面創(chuàng)建/刪除目錄、讀寫文件、建立鏈接文件,都會導(dǎo)致內(nèi)核中相關(guān)函數(shù)被調(diào)用。
站在用戶的角度來說,一個文件系統(tǒng)里面有目錄、文件兩種對象。在 configfs 的內(nèi)核實現(xiàn)中,對應(yīng) 4 個概念。從底往上看:
configfs_attribute、configfs_bin_attribute:對應(yīng)文件
configfs_attribute 對應(yīng)的文件里含有的是可視化的字符串信息,它在內(nèi)核里有一個結(jié)構(gòu)體:
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 對應(yīng)的文件里含有的是二進(jìn)制信息,它在內(nèi)核里有一個結(jié)構(gòu)體:
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);};
讀寫文件時,會導(dǎo)致上述結(jié)構(gòu)體里的 show/store 或者 read/write 函數(shù)被調(diào)用
文件是位于某個目錄的: config_item
config_item:configfs 中的每個對象都是 config_item,后面的 config_group、subsystem
本質(zhì)上都屬于特殊的 config_item
config_group、subsystem,config_item 都對應(yīng)一個目錄
跟 config_group、subsystem 對比時,config_item 這個目錄下不再有目錄
在 config_item 目錄下有屬性文件,還可以創(chuàng)建鏈接文件
鏈接文件的操作結(jié)構(gòu)體是:config_item_type 里的 configs_item_operations
config_group:它是特殊的 config_item,它有對應(yīng)一個目錄
普通的 config_item:下面不再有子目錄
config_group:下面還可以創(chuàng)建 config_item 或者 config_group,即:下面可以再創(chuàng)建子目錄
在當(dāng)前目錄下操作子目錄時,對應(yīng)的操作結(jié)構(gòu)體是:config_item_type 里的 configs_group_operations
subsystem:它是 configfs 文件系中的最頂層
比如:/sys/kernel/config/usb_gadget、/sys/kernel/config/iio
在driversusbgadgetconfigfs.c中調(diào)用configfs_register_subsystem(&gadget_subsys)就會創(chuàng)建
subsystem,它對應(yīng) configfs 文件系統(tǒng)中的頂層目錄usb_gadget
subsystem 也屬于 config_group
2.3 configfs 使用流程
跟 legacy 方法類比,要做的事情是一樣的:
創(chuàng)建 usb_composite_dev
設(shè)置設(shè)備描述符
設(shè)置配置描述符
添加接口(功能)
-
嵌入式
+關(guān)注
關(guān)注
5088文章
19158瀏覽量
306484 -
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209970 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4344瀏覽量
62812
發(fā)布評論請先 登錄
相關(guān)推薦
評論