详细说明见:https://blog.csdn.net/fudan_abc/article/category/332148
1.sysfs初探
系统/sys为系统状态映射文件所在的目录。“sysfs"是一个虚拟文件系统(类似proc文件系统),用于将系统中的设备组成层次结构,并向用户模式程序提供详细的内核数据结构信息。
/sys目录中文件为:
tl@tl-virtual-machine:~$ ls /sys/ block bus class dev devices firmware fs hypervisor kernel module power
- block:包含所有的块设备。
tl@tl-virtual-machine:~$ ls /sys/block/ fd0 loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 ram0 ram1 ram10 ram11 ram12 ram13 ram14 ram15 ram2 ram3 ram4 ram5 ram6 ram7 ram8 ram9 sda sr0
- device:包含系统中所有的设备,并根据设备挂接的总线类型组织层次结构。
- bus:包含系统中所有的总线类型。
- drivers:包含内核中所有已注册的设备驱动程序
- class:系统中的设备类型(如网卡、声卡等设备)。
/sys下面的目录和文件反映了整台机器的系统状态。比如bus目录:
tl@tl-virtual-machine:~$ ls /sys/bus/ ac97 clocksource eisa gameport isa mdio_bus pci platform rapidio sdio spi virtio xen-backend acpi cpu event_source i2c machinecheck mmc pci_express pnp scsi serio usb xen
这里面包含了系统用到的一系列总线:包括pci,ide,scci,usb等,比如可以在usb/文件中发现U盘、USB鼠标等信息。
sysfs是一个虚拟的文件系统。文件系统,狭义的理解“文件”就是指磁盘文件,广义的理解就是有组织有次序的存储与任何介质(包括内存)的一组信息。Linux把所有的资源都看成是文件,让用户通过一个统一的文件系统操作接口,对不同的文件系统进行操作。这样就可以对用户程序隐藏的各种不同的文件系统实现细节,为用户提供了一个统一、抽象、虚拟的文件系统接口,这就是所谓的“VFS(Virtual Filesystem Switch)"。这个抽象出来的接口就是一组函数操作。
sysfs是一个虚拟的文件系统,并没有一个实际存放文件的介质,断电后就完了(一般而言,在使用mount命令挂载一个分区时,会设置文件系统)。简而言之,sysfs的信息来源是设备的层次结构,读一个sysfs文件,就是动态的从设备树中寻找相关节点,提取信息,返回给用户。
所谓设备的层次结构就是设备如何被组织关联起来,也就是Linux的设备模型。
2.设备模型
建立设备模型的意义在于方便管理。最初Linux建立设备模型的初衷就是为了省电,建立一个全局的设备树,当系统进入休眠时,系统可以通过这棵树找到所有的设备,随时让它们挂起,或是唤醒,说简单点就是实现一些动态的电源管理功能。当热插拔技术出现后设备模型还要能够动态的反映出设备的变化情况,不能只在开机的时候遍历一遍就了事。设别模型支持如下功能:
(1)电源管理和系统关机;
(2)与用户空间通信。这些同行都是通过sysfs文件系统这个中介来完成的。sysfs文件系统紧密的团结在设备模型周围,把控制设备的接口(比如休眠,唤醒)通过这个文件形式发送给用户空间,可以通过读写sysfs中文件的方式,读取或改变设备的配置。
(3)支持热插拔。
(4)设备分类。
(5)对象的生命周期,如把USB鼠标拔了之后,全局设备树和sysfs中也要相应去掉。
2.1设备底层模型
(1)kobject
Linux设备模型的底层是数据结构kobject。前面说过,设备模型的首要任务是把设备连在一起,形成一个清晰明朗的树状结构。对于设备而言,设备的一些属性,如设备名称、设备上锁、用来形成树状结构的链表指针等,均被放在了一个数据结构中,便于管理,这个数据结构就是kobject。
kobject,顾名思义就是,kernel内核对象,即类似于抽象的基类。
(2)kset
kset,顾名思义就是kobject的集合。kobject通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合,kobject相当于叶子节点,kset相当于内节点二者连接形成了一个树状结构。
(3)kobj_type
kobject是嵌入到device,driver,bus这些大容器中的数据结构,每个容器也会有不同的属性可供配置,kobj_type正是说明kobject类型的结构。
2.2设备模型的上层容器
Linux设备模型通过总线(bus),设备(device),驱动(device_driver)这三个数据结构来描述的。总线是处理器和一个或者多个设备之间的通道,在设备模型中,所有的设备都是通过总线来连接。总线中可以插入另一个总线,如USB控制器常常是一个PCI设备。总之,设备模型表示了设备,驱动和总线之间的连接关系。
我们说的一个设备(或驱动),实际上说明的是属于某个总线系统下的设备(或驱动)。比如说网卡驱动,有USB总线下的网卡驱动,也有PCI总线下的网卡驱动。
3.sysfs文件系统
sysfs文件系统就是利用VFS的接口去读写kobject的层次结构,建立起来的文件系统。