一 sys 文件系统
sysfs文件系统,是用来对系统的设备进行管理的,它可以产生一个包括所有系统硬件的层级视图。sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件,展示设备驱动模型中各组件的层次关系。用户空间的程序同样可以利用这些信息以实现和内核的交互。
sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象(kernel object,如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。可以简单的理解为 sysfs就是把内核中的硬件模块抽象成sysfs下的一个目录,硬件模块的属性抽象成该目录下的一个属性文件。
二 sysfs 目录结构
sysfs 文件系统与其它文件系统一样,由目录、文件、链接组成。sysfs 文件系统只存在于内存中,动态的表示着内核的数据结构。sysfs 文件系统挂接了一些子目录,这些目录代表了注册在 sysfs 中主要的子系统。
# ls /sys/
block bus class dev devices firmware fs kernel module power
devices : 系统中所有的设备(对象)都会在 /sys/devices体现出来,是sysfs文件系统中最重要的目录结构。
dev:包括所有的块设备和字符设备,该目录下有很多以主设备号:次设备号(major:minor)命名的链接文件,这些文件都链接到 /sys/devices 目录下对应的设备。
ls /sys/dev/char/
10:130 10:237 10:61 1:11 13:64 1:8 207:16 252:0 254:0 4:10 4:14 4:18 4:21 4:25 4:29 4:32 4:36 4:4 4:43 4:47 4:50 4:54 4:58 4:61 4:8 5:2 7:129 89:0
10:183 10:58 10:62 116:33 13:65 189:0 207:18 252:1 29:0 4:11 4:15 4:19 4:22 4:26 4:3 4:33 4:37 4:40 4:44 4:48 4:51 4:55 4:59 4:62 4:9 7:0 7:130 89:1
10:229 10:59 10:63 1:3 1:5 189:1 226:0 253:0 4:0 4:12 4:16 4:2 4:23 4:27 4:30 4:34 4:38 4:41 4:45 4:49 4:52 4:56 4:6 4:63 5:0 7:1 7:2
10:235 10:60 1:1 13:63 1:7 1:9 251:0 253:1 4:1 4:13 4:17 4:20 4:24 4:28 4:31 4:35 4:39 4:42 4:46 4:5 4:53 4:57 4:60 4:7 5:1 7:128 81:0
# ls /sys/dev/block/
1:0 1:10 1:12 1:14 1:2 1:4 1:6 179:0 179:16 179:18 179:32 179:64 1:9 7:1 7:3 7:5 7:7
1:1 1:11 1:13 1:15 1:3 1:5 1:7 179:1 179:17 179:2 179:48 1:8 7:0 7:2 7:4 7:6
bus: 内核设备按照总线类型分层放置的目录结构,devices中的所有设备都是链接与某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接。
bus 目录包含了在内核中注册而得到支持的每个物理总线的子目录,例如 ide、pci、scsi、usb、i2c、sdio 总线等。
# ls /sys/bus/
clockevents clocksource container cpu event_source hid i2c mdio_bus mmc platform rpmsg scsi sdio serio soc spi usb virtio workqueue
其中每个目录中的结构都大同小异。这里以 usb 目录为例,分析其目录结构关系。
# ls /sys/bus/usb/
devices drivers drivers_autoprobe drivers_probe uevent
usb 目录中包含了 devices 和 drivers 目录。devices 目录包含了 USB 总线下所有的设备,这些设备实际上是指向 devices 目录中相应设备的符号链接。
# ls /sys/bus/usb/devices/ -l
total 0
drwxr-xr-x 2 root root 0 1月 25 19:52 ./
drwxr-xr-x 4 root root 0 1月 25 19:51 ../
lrwxrwxrwx 1 root root 0 1月 25 19:41 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-0:1.0/
lrwxrwxrwx 1 root root 0 1月 25 19:41 2-2 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/
lrwxrwxrwx 1 root root 0 1月 25 19:41 2-2:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2:1.0/
其中 1-0:1.0 和 2-2:1.0 是 USB 设备的名称,这些名称由 USB 协议规范来定义。链接的目的是为了构建 sysfs 文件系统的层次结构。
drivers 目录包含了 USB 总线下注册时所有驱动程序的目录。每个驱动目录中,有允许查看和操作设备参数的属性文件,和指向该设备所绑定的物理设备的符号链接
root@ubuntu:/sys/bus/usb/drivers/usb# ll
total 0
drwxr-xr-x 2 root root 0 1月 25 19:56 ./
drwxr-xr-x 6 root root 0 1月 25 19:52 ../
lrwxrwxrwx 1 root root 0 1月 25 19:56 2-2 -> ../../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/
lrwxrwxrwx 1 root root 0 1月 25 19:56 3-1 -> ../../../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-1/
lrwxrwxrwx 1 root root 0 1月 25 19:56 3-3 -> ../../../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-3/
lrwxrwxrwx 1 root root 0 1月 25 19:56 3-4 -> ../../../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-4/
class: 这是按照设备功能分类的设备模型,如系统中所有的输入设备都会出现在 /sys/class/input之下,而不论他们是以何种总线连接到系统。
例如固件类(firmware)、混杂设备类(misc)、图形类(graphics)、声音类(sound)、和输入类(input)等。
kernel: 这里是内核所有可调整参数的位置。
module: 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件中,还是编译为外部模块(ko文件),都可能出现在 /sys/module中
编译为外部模块(ko文件)在加载后会出现对应的 /sys/module/<module_name>/ ,并且在这个目录下会出现一些属性文件和属性目录,来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等。
编译为内联方式的模块则只在当他有非0属性的模块参数时会出现的对应的 /sys/module/<module_name>/ ,这些模块的可用参数会出现在 /sys/module//parameter/<param_name>中。
如 /sys/module/printk/parameters/time这个可读写参数控制着内联模块printk在打印内核消息时 是否加上时间前缀。
没有非0属性参数的内联模块不会出现于此。
power: 这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其写入控制指令让机器关机,重启等。
三 提供应用层的访问控制接口
应用层想要对底层硬件进行操控,通常可以通过两种方式:
1 /dev/目录下的设备文件(设备节点)
2 /sys/目录下设备的属性文件。
具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控。
当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、GPIO 等。
但对于一些较复杂的设备通常会使用设备节点的方式,譬如 LCD 等、触摸屏、摄像头等。
本文介绍了sysfs文件系统,它用于管理系统设备,将设备和总线组织成分级文件,展示组件层次关系,方便用户空间与内核交互。还阐述了sysfs的目录结构,如devices、bus等目录。此外,说明了应用层操控底层硬件可通过/dev/目录设备文件或/sys/目录属性文件,不同设备适用方式不同。
1572





