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