>>>>>3sysfs文件系统
sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。该文件系统的目录层次结构严格按照内核的数据结构组织。除了二进制文件外(只有特殊场合才使用),sysfs文件内容均以ASCII格式保存,且一个文件只保存一个数据,另外,一个文件不可大于一个内存页(通常为4096字节)。
sysfs提供一种机制,使得可以显式的描述内核对象、对象属性及对象间关系。sysfs有两组接口,一组针对内核,用于将设备映射到文件系统中,另一组针对用户程序,用于读取或操作这些设备。表2描述了内核中的sysfs要素及其在用户空间的表现:
sysfs在内核中的组成要素在用户空间的显示内核对象(kobject)对象属性(attribute)
目录文件
对象关系(relationship)链接(SymbolicLink)
表2:sysfs内部结构与外部表现
在Ubuntu或Fedora等Linux系统中,我们可以用ls–F<路径>命令来通过文件后缀查看文件类型。“/”表示文件夹,“@”表示链接,没有后缀就是文件了。
sysfs目录结构
/sys下的子所包含的内容目录
/sys/devices这是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的
最重要的目录结构;
/sys/dev
这个目录下维护一个按字符设备和块设备的主次号码(major:minor链接到真实的设备(/sys/devices下的符号链接文件;
/sys/bus
这是内核设备按总线类型分层放置的目录结构,devices中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成Linux统一设备模型的一部分;
/sys/class这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在
/sys/class/input之下,而不论它们是以何种总线连接到系统。它也是构成Linux统一设备模型的一部分;
/sys/kernel这里是内核所有可调整参数的位置,目前只有uevent_helper,kexec_loaded,
mm,和新式的slab分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于sysctl(/proc/sys/kernel接口中;
/sys/module这里有系统中所有模块的信息,不论这些模块是以内联(inlined方式编译到内
>>>>核映像文件(vmlinuz中还是编译为外部模块(ko文件,都可能会出现在/sys/module中:
编译为外部模块(ko文件在加载后会出现对应的
/sys/module//,并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等;
编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的/sys/module/,这些模块的可用参数会出现在/sys/modules//parameters/中,
o如/sys/module/printk/parameters/time这个可读写参数控制着
内联模块printk在打印内核消息时是否加上时间前缀;
o所有内联模块的参数也可以由
".="的形式写在内核启动参数上,如启动内核时加上参数"printk.time=1"与向"/sys/module/printk/parameters/time"写入1的效果相同;
没有非0属性参数的内联模块不会出现于此。
/sys/power这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的
电源状态,如可以向其中写入控制命令让机器关机、重启等。
表3:sysfs目录结构
深入理解sysfs
sysfs_dirent是组成sysfs单元的基本数据结构,