|
楼主 |
发表于 2007-4-18 18:58:18
|
显示全部楼层
1. sysfs 的历史
sysfs是一个in-memory文件系统,最开始是基于ramfs的, ramfs是在2.4.0版内核稳定过程中的时候写成的,它作得很妙,通过它可以看到利用当时还是新事物的VFS layer写一个简单的文件系统是多么地容易,由于它简易并使用VFS,它成为一个好的基础,使其它的in-memory文件系统从它那里衍生出来。
sysfs 最初被称为ddfs(设备驱动文件系统),它的产生是为了调试正在开发过程中的新的驱动模型,调试代码最初使用procfs来出报设备树,但在莱纳斯*托瓦兹的严格的催促下,它转而使用了一个基于ramfs的新的文件系统。
当时,这种新的设备模型被溶入内核(2.5.1前后),为了使其更明了给它换了个名字叫driverfs,次年在2.5版的开发中,这种设备模型与设备文件系统的底层功能证明对其它的子系统很有用。kobject被开发出来,提供了一个中央对象管理机制,而设备文件系统则被转换成sysfs,来表示它的子系统的不可预知性。
2. sysfs 的挂载
sysfs像其它基于内存的文件系统一样可以从用户空间挂载:
mount -t sysfs sysfs /sys
sysfs还能够在启动时用/etc/fstab文件来自动挂载。大多数支持2.6 内核的发行版都在 /etc/fstab有sysfs行:
sysfs /sys sysfs noauto 0 0
注意sysfs被挂载的目录:/sys, 这是sysfs 佳载点的事实标准位置,各主流发行版都采用这个作法。
3.sysfs 的浏览
既然sysfs是由目录、文件、软连接组成的集合,那么就可以用简单的 shell工具来浏览和操作,本人推荐用 tree(1)这个工具,它是内核对象底层的核心的开发过程中最得力的助手。
sysfs挂载点的顶层是一定数量的目录,这些目录代表了注册了sysfs的主要的子系统。在本文撰写之时, 这些目录是:
/sys/
| - - block
| - - bus
| - - class
| - - device
| - - firmware
| - - module
| - - power
这些目录是在子系统注册kobject核心的系统启动时刻产生的, 当它们被初始化以后, 它们开始搜寻在各自的目录内注册了的对象。对象注册sysfs的方式以及目录如何产生的将在后文解释. 其间, 有兴趣的话最好在这个sysfs层级中来一番审视, 下面叙述各子系统的含义以及它们的内容。
3.1 块
"块"目录包含了在系统中发现的每个块设备的子目录,每个块设备的目录中是各种属性,描述了方方面面,从设备大小到映射的dev_t数值,有一个指向块设备所映射的物理设备的软连接(在物理设备树上,将在后文说到),还有一个目录揭示了I/O调度器的接口,这个接口提供了一些数据,它们是关于设备请求队列和一些可调整的特性,用户和管理员可以用它们来优化性能,包括用它们来动态改变I/O调度器。每个分区块设备表示为块设备的子目录,这些目录中包含了分区的只读属性。
3.2 总线
"总线"目录包含了在内核中注册而得到支持(统一编译或是通过模块来加载的)的每个物理总线类型的子目录, 部分输出如下:
bus/
| - - ide
| - - pci
| - - scsi
| - - usb
每个总线类型以两个子目录列出: devices 和 drivers , devices目录包含了在整个系统中发现的每一个该总线类型的设备的列表,这些列出的设备实际上是在全局设备树中指向设备目录的符号连接。如:
| - - 0000:00:00.0 -> ../../../devices/pci0000:00/0000:00:00.0
| - - 0000:00:01.0 -> ../../../devices/pci0000:00/0000:00:01.0
| - - 0000:01:00.0 -> ../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0
| - - 0000:02:00.0 -> ../../../devices/pci0000:00/0000:00:1e.0/0000:02:00.0
| - - 0000:02:00.1 -> ../../../devices/pci0000:00/0000:00:1e.0/0000:02:00.1
| - - 0000:02:01.0 -> ../../../devices/pci0000:00/0000:00:1e.0/0000:02:01.0
| - - 0000:02:02.0 -> ../../../devices/pci0000:00/0000:00:1e.0/0000:02:02.0
drivers目录包含了注册该总线类型的每个驱动的目录,每个驱动目录中是允许查看和操作设备参数的属性,和指向该设备所绑定的物理设备(在全局设备树上)的软连接。
3.3 类
"类“目录包含了在内核中注册了的每个设备类的表示,一个设备类描述了设备的一个功能类型,如下:
class/
| - - graphics
| - - input
| - - net
| - - printer
| - - scsi_device
| - - sound
| - - tty
每个设备类包含了每个分配并注册了那个设备类的类对象的子目录,大多数设备类对象的目录包含了指向与那个类对象关联的设备和驱动目录(分别在全局的设备层级与总线层级)的软连接,注意,在设备与物理设备之间不一定是1:1的映射,一个物理设备也许包含多个类对象执行不同的逻辑功能。例如,一个物理鼠标会映射一个内核鼠标对象,也会映射一个泛”输入事件“设备,也许还会映射一个”输入调试“设备。每个类与类对象会包含各种属性,它们阵列出参数来描述并控制那个类对象,内容与格式完全是类依赖的,并依赖于内核中所存的支持。
(待续) |
|