Linux设备管理(四)

sysfs是一个基于ramfs的文件系统,在2.6内核开始引入,用来导出内核对象(kernel object)的数据、属性到用户空间。与同样用于查看内核数据的proc不同,sysfs只关心具有层次结构的设备信息,比如系统中的总线,驱动以及已经加载的模块等,而诸如PID等信息还是使用proc来管理。本质上,sysfs文件的层次结构就是基于内核中kset与kobject逻辑结构来组织的。从驱动开发的角度,sysfs为我们提供了除了虚拟字符设备的read/write/ioctlproc系统之外的另外一种通过用户空间访问内核数据的方式。想要使用sysfs,编译内核的时候需要定义CONFIG_SYSFS,可以通过mount -t sysfs sysfs /sys命令来挂载sysfs到"/sys"目录。本文以Ubuntu15.04(3.19)为例分析。

sysfs目录结构

sysfs的布局体现内核的数据结构,顶层的目录有

$ls /sys/ block/ bus/ class/ dev/ devices/ firmware/ fs/ hypervisor/ kernel/ module/ power/

每一个目录都对应内核中的一个kset,每一个kset还会包含一些kobject或其他kset。下面针对常用目录做一个简单的介绍

/sys/block/

块设备的存放目录,这是一个过时的接口,按照sysfs的设计理念,所有的设备都存放在"sys/devices/"同时在"sys/bus/"或(和)"sys/class/"存放相应的符号链接,所以现在这个目录只是为了提高兼容性的设计,里面的文件已经被全部替换成了符号链接,只有在编译内核的时候勾选CONFIG_SYSFS_DEPRECATED才会有这个目录,

sys $ll block/ total 0 lrwxrwxrwx 1 root root 0 1220 11:29 dm-0 -> ../devices/virtual/block/dm-0/ lrwxrwxrwx 1 root root 0 1220 11:29 dm-1 -> ../devices/virtual/block/dm-1/ ... /sys/bus/

bus包含了系统中所有的总线,比如我的系统当前提供的总线有:

sys $ls bus/ acpi/ container/ i2c/ media/ mipi-dsi/ pci/ pnp/ sdio/ usb/ platform/ scsi/ spi/ ...

每一种总线通常还有两个子目录:device和driver,这两个字目录分别对应内核中的两个kset,同时bus本身也对应一个kset,也有自己的kobject和以及(可能)有相应的ktype。我们可以查看相应的kset属性。

sys $ls bus/platform/ devices/ drivers/ drivers_autoprobe drivers_probe uevent sys $cat bus/platform/drivers_autoprobe 1

我们可以扒一下3.19的源码,找到这个属性

//include/linux/platform_device.h 22 struct platform_device { ... 26 struct device dev; ... 38 }; //include/linux/device.h 731 struct device { ... 744 struct bus_type *bus; /* type of bus device is on */ ... 800 }; 104 struct bus_type { ... 129 struct subsys_private *p; ... 131 }; //drivers/base/base.h 28 struct subsys_private { 29 struct kset subsys; 30 struct kset *devices_kset; ... 38 unsigned int drivers_autoprobe:1; #Bingo!!! ... 43 };

同时,根据kset的组织形式,平台总线的设备kset链接了挂接在平台总线上的所有设备,所以"platform/devices"下应该可以查看到,要注意的事,为了使一个设备在sysfs中只有一个实例,很多目录都是使用符号链接的形式,下面显示的结果也验证了这种设计。

sys $ll bus/platform/devices/ lrwxrwxrwx 1 root root 0 1219 08:17 ACPI0003:00 -> ../../../devices/pci0000:00/0000:00:14.3/PNP0C09:00/ACPI0003:00/ ... sys $ll bus/platform/drivers/thinkpad_acpi/ lrwxrwxrwx 1 root root 0 1220 20:19 thinkpad_acpi -> ../../../../devices/platform/thinkpad_acpi/ --w------- 1 root root 4096 1220 20:18 uevent --w------- 1 root root 4096 1220 20:19 unbind -r--r--r-- 1 root root 4096 1220 20:19 version ... sys $cat bus/platform/drivers/thinkpad_acpi/version ThinkPad ACPI Extras v0.25 /sys/class/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4660794135ab141263397c309971b569.html