linux内核源码分析之sysfs文件系统
sysfs概述
使用 sysfs
sysfs文件目录
实例
sysfs概述
sysfs是一个面向用户空间导出内核对象的文件系统,它不仅提供了察看内核内部数据结构的能力,还可以修改这些数据结构。即用于导出内核对象(kobject)的文件系统。
sysfs数据项来源于内核对象(kobject),而内核对象的层次化组织直接反应了sysfs的目录布局。
sysfs 始终与 kobject 的底层结构紧密相关
与proc区别,新设计的内核机制应该尽量使用 sysfs 机制,而将 proc 保留给纯净的“进程文件系统”
使用 sysfs
只要内核配置中定义了 CONFIG_SYSFS ,sysfs 总是被编译进内核。可通过以下命令挂载它:
mount -t sysfs sysfs /sys
sysfs文件目录
总线、设备、驱动程序和类是使用kobject机制的主要内核对象,因而占据了sysfs中几乎所有的数据项。查看系统中sys目录
(base) root@ubuntu:/sys# ls -ltotal 0drwxr-xr-x 2 root root 0 Mar 20 02:18 blockdrwxr-xr-x 45 root root 0 Mar 20 02:18 busdrwxr-xr-x 70 root root 0 Mar 20 02:18 classdrwxr-xr-x 4 root root 0 Mar 20 02:18 devdrwxr-xr-x 16 root root 0 Mar 20 02:18 devicesdrwxr-xr-x 5 root root 0 Mar 20 02:18 firmwaredrwxr-xr-x 10 root root 0 Mar 20 02:18 fsdrwxr-xr-x 2 root root 0 Mar 26 00:39 hypervisordrwxr-xr-x 15 root root 0 Mar 20 02:18 kerneldrwxr-xr-x 178 root root 0 Mar 20 02:18 moduledrwxr-xr-x 3 root root 0 Mar 20 02:18 power
- devices/ 包含了一个设备树的文件系统表示。他直接映射了内部的内核设备树,反映了设备的层次结构。
- bus/ 包含了内核中各种总线类型的平面目录布局。每个总线目录包含两个子目录:devices/与 drivers/
devices/ 包含了系统中出现的每个设备的符号链接,他们指向 root/ 下的设备目录。
drivers/ 包含了每个已为特定总线上的设备而挂载的驱动程序的目录(这里假定驱动没有跨越多个总线类型)。
- fs/ 包含了一个为文件系统设立的目录。现在每个想要导出属性的文件系统必须在 fs/ 下创建自己的层次结构。
- dev/ 包含两个子目录: char/ 和 block/。在这两个子目录中,有以: 格式命名的符号链接。这些符号链接指向 sysfs 目录中相应的设备。/sys/dev 提供一个通过一个 stat(2) 操作结果,查找设备 sysfs 接口快捷的方法。
实例(GPIO)
内核驱动向用户提供的接口,以GPIO为例,在用户态直接操作gpio
#导出echo 9 > /sys/class/gpio/export#设置方向echo out > /sys/class/gpio/gpio9/direction#拉高拉低echo 0 > /sys/class/gpio/gpio9/value
内核参考学习链接
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂