guojun-junguo

详细说明见: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的层次结构,建立起来的文件系统。

  

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2022-01-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
  • 2022-01-13
  • 2021-11-10
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-05-21
  • 2021-08-30
  • 2022-01-23
  • 2021-08-26
  • 2022-12-23
相关资源
相似解决方案