1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁。属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件。与sysfs一样,readdir查询链表上的items和/或attributes。
2.symlink可用于将items组合在一起。 与sysfs不同,表示的生命周期完全由用户空间驱动,支持这items的内核模块必须响应这一点。
3.平台A上是在init.rc文件中挂载的
mount configfs none /config
在init.recovery.BOARD.rc文件中在adb初始化好后将 setprop sys.usb.configfs 1
注意persist.sys.usb.config属性:# getprop persist.sys.usb.config mobile_link,adb
4.查看USB相关的属性:# getprop |grep usb
5.这些使用configfs作为subsystems注册其item types的模块称为客户端模块。一旦加载了client subsystem后,它将显示为/config下的子目录(或多个子目录)。
6.通过mkdir创建一个item。 该item的属性(文件)也将在这个时候出现。
7.当需要销毁某个项目时,请使用rmdir将其删除。 如果一个item存在任何其他链接,则无法销毁该项目。 可以通过unlink删除链接。
8.configfs中的每个对象都是一个config_item。 一个config_item反映了此子系统中的一个对象
9.group是共享相同属性和操作的项的集合。 Items由mkdir创建并由rmdir删除,但configfs处理它, 该group具有一组执行这些任务的操作。
10.在初始化期间,客户端模块注册子系统到configfs,子系统显示为configfs文件系统下的顶级的目录。 一个子系统也是一个config_group,可以完成config_group所能做的一切。
11.config_item的所有用户都应该通过config_item_get()来引用它,并在引用完成时通过config_item_put()删除引用。
12.config_item_type指定config_item的行为,提供操作函数。
13.动态分配的所有项items都需要提供ct_item_ops->release()方法释放。 当config_item的引用计数达到零时,将调用此方法。
14.当config_item希望某个属性在项目的configfs目录中显示为文件时,它必须定义一个configfs_attribute来描述它
15.config_item无法凭空存在,config_group上的mkdir是创建它的唯一方法。 这将触发子项目的创建。
16.正确配置该项目意味着一个组可以作为一个项目本身(也即一个config_group本身也是一个config_item)。 但是,它可以做更多:它可以创建子项或组。这是通过组的config_item_type上指定的组操作完成的。
17.当调用rmdir时,configfs将从文件系统树中删除该项(假设它没有子节点来保持它忙)。 子系统负责响应这一点。 如果子系统在其它线程中对该项目具有引用,则内存是安全的(引用计数保证的).
项目实际上可能需要一些时间才能从子系统的使用中消失。 但它已经从configfs中消失了。
18.当rmdir --> drop_item()被调用时,项目的链接已被拆除。它不再具有对其父级的引用,并且在项目层次结构中没有位置了。 如果客户端在拆除发生之前需要进行一些清理工作,则子系统可以实
现configfs_group_operations.disconnect_notify()方法。 这个方法将会在configfs将此项目从文件系统视图中移除之后,但在从其父group中删除之前调用。
19.一个子系统永远不会触及文件系统部分,但子系统可能对此层次结构感兴趣。
20.configfs构建出一个层次结构,层次结构通过config_group->cg_children和config_item->ci_parent构成树状结构。子系统可以导航cg_children列表和ci_parent指针以查看子系统创建的树。
这可能与configfs管理层次结构竞争,因此configfs使用子系统互斥锁来保护修改。 每当子系统想要导航层次结构时,它必须