使用 sysfs 文件系统访问 Linux 内核

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

使用sysfs文件系统访问Linux内核简介:sysfs是Linux内核中设计较新的一种虚拟的基于内存的文件系统,它的作用与proc有些类似,但除了与proc相同的具有查看和设定内核参数功能之外,还有为Linux统一设备模型作为管理之用。相比于proc文件系统,使用sysfs导出内核数据的方式更为统一,并且组织的方式更好,它的设计从proc中吸取了很多教训。本文就sysfs的挂载点/sys目录结构、其与Linux统一设备模型的关系、常见属性文件的用法等方面对sysfs作入门介绍,并且就内核编程方面,以具体的例子来展示如何添加sysfs支持sysfs与/syssysfs文件系统总是被挂载在/sys挂载点上。虽然在较早期的2.6内核系统上并没有规定sysfs的标准挂载位置,可以把sysfs挂载在任何位置,但较近的2.6内核修正了这一规则,要求sysfs总是挂载在/sys目录上;针对以前的sysfs挂载位置不固定或没有标准被挂载,有些程序从/proc/mounts中解析出sysfs是否被挂载以及具体的挂载点,这个步骤现在已经不需要了。请参考附录给出的sysfs-rules.txt文件链接。sysfs与procsysfs与proc相比有很多优点,最重要的莫过于设计上的清晰。一个proc虚拟文件可能有内部格式,如/proc/scsi/scsi,它是可读可写的,(其文件权限被错误地标记为了0444!,这是内核的一个BUG),并且读写格式不一样,代表不同的操作,应用程序中读到了这个文件的内容一般还需要进行字符串解析,而在写入时需要先用字符串格式化按指定的格式写入字符串进行操作;相比而言,sysfs的设计原则是一个属性文件只做一件事情,sysfs属性文件一般只有一个值,直接读取或写入。整个/proc/scsi目录在2.6内核中已被标记为过时(LEGACY),它的功能已经被相应的/sys属性文件所完全取代。新设计的内核机制应该尽量使用sysfs机制,而将proc保留给纯净的“进程文件系统”。回页首初识/sys清单1.与/sys文件系统的一次交互(视内核版本号和外接设备的不同,在您的系统上执行这些命令的结果可能与此有所不同)$ls-F/sysblock/bus/class/dev/devices/firmware/fs/kernel/module/power/$ls-F/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/broken_parity_statusenablemodaliasresource0romueventclassirqmsi_busresource0_wcsubsystem@vendorconfiglocal_cpulistpower/resource1subsystem_devicedevicelocal_cpusresourceresource2subsystem_vendor这是在Fedora10的2.6.27.5-117.fc10.i686的内核上,可以看到在/sys目录下有block,bus,class,dev,devices,firmware,fs,kernel,module,power这些子目录,本文将分别介绍这些目录存在的含义。第二个ls命令展示了在一个pci设备目录下的文件,ls命令的-F命令为所列出的每个文件使用后缀来显示文件的类型,后缀/表示列出的是目录,后缀@表示列出的是符号链接文件。可以看到第二个目录下包含有普通文件(regularfile)和符号链接文件(symboliclinkfile),本文也将以这个具体的设备为例说明其中每一个普通文件的用途。回页首/sys文件系统下的目录结构/sys下的目录结构是经过精心设计的:在/sys/devices下是所有设备的真实对象,包括如视频卡和以太网卡等真实的设备,也包括ACPI等不那么显而易见的真实设备、还有tty,bonding等纯粹虚拟的设备;在其它目录如class,bus等中则在分类的目录中含有大量对devices中真实对象引用的符号链接文件;清单1中在/sys根目录下顶层目录的意义如下:表1./sys下的目录结构/sys下的子目录所包含的内容/sys/devices这是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的最重要的目录结构,下文会对它的内部结构作进一步分析;/sys/dev这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件,它是在内核2.6.26首次引入;/sys/bus这是内核设备按总线类型分层放置的目录结构,devices中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成Linux统一设备模型的一部分;/sys/class这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统。它也是构成Linux统一设备模型的一部分;/sys/block这里是系统中当前所有的块设备所在,按照功能来说放置在/sys/class之下会更合适,但只是由于历史遗留因素而一直存在于/sys/block,但从2.6.22开始就已标记为过时,只有在打开了CONFIG_SYSFS_DEPRECATED配置下编译才会有这个目录的存在,并且在2.6.26内核中已正式移到/sys/class/block,旧的接口/sys/block为了向后兼容保留存在,但其中的内容已经变为指向它们在/sys/devices/中真实设备的符号链接文件;/sys/firmware这里是系统加载固件机制的对用户空间的接口,关于固件有专用于固件加载的一套API,在附录LDD3一书中有关于内核支持固件加载机制的更详细的介绍;/sys/fs这里按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有fuse,gfs2等少数文件系统支持sysfs接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在sysctl(/proc/sys/fs)接口中中;/sys/kernel这里是内核所有可调整参数的位置,目前只有uevent_helper,kexec_loaded,mm,和新式的slab分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于sysctl(/proc/sys/kernel)接口中;/sys/module这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在/sys/module中:编译为外部模块(ko文件)在加载后会出现对应的/sys/module/module_name/,并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等;编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的/sys/module/module_name,这些模块的可用参数会出现在/sys/modules/modname/parameters/param_name中,o如/sys/module/printk/parameters/time这个可读写参数控制着内联模块printk在打印内核消息时是否加上时间前缀;o所有内联模块的参数也可以由module_name.param_name=value的形式写在内核启动参数上,如启动内核时加上参数printk.time=1与向/sys/module/printk/parameters/time写入1的效果相同;没有非0属性参数的内联模块不会出现于此。/sys/power这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。/sys/slab(对应2.6.23内核,在2.6.24以后移至/sys/kernel/slab)从2.6.23开始可以选择SLAB内存分配器的实现,并且新的SLUB(UnqueuedSlabAllocator)被设置为缺省值;如果编译了此选项,在/sys下就会出现/sys/slab,里面有每一个kmem_cache结构体的可调整参数。对应于旧的SLAB内存分配器下的/proc/slabinfo动态调整接口,新式的/sys/kernel/slab/slab_name接口中的各项信息和可调整项显得更为清晰。接下来对/sys/devices/下的目录结构作进一步探讨:清单2.查看/sys/devices/的目录结构$ls-F/sys/devices/isa/LNXSYSTM:00/pci0000:00/platform/pnp0/pnp1/system/virtual/可以看到,在/sys/devices/目录下是按照设备的基本总线类型分类的目录,再进入进去查看其中的PCI类型的设备:清单3.查看/sys/devices/pci0000:00/的目录结构$ls-F/sys/devices/pci0000:00/0000:00:00.0/0000:00:02.5/0000:00:03.1/0000:00:0e.0/power/0000:00:01.0/0000:00:02.7/0000:00:03.2/firmware_node@uevent0000:00:02.0/0000:00:03.0/0000:00:03.3/pci_bus/在/sys/devices/pci0000:00/目录下是按照PCI总线接入的设备号分类存放的目录,再查看其中一个,清单4.查看/sys/devices/pci0000:00/的目录结构$ls-F/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/devicelocal_cpuspower/subsystem_vendorbroken_parity_statusenablemodaliasresourceueventclassirqmsi_bussubsystem@vendorconfiglocal_cpulistpci_bus/subsystem_device可以看到,其中有一个目录0000:01:00.0/,其它都是属性文件和属性组,而如果对0000:01:00.0/子目录中进行再列表查看则会得到清单1的目录结构。继续以上过程可以了解整个目录树的结构,这里把它整理成图1.sysfs目录层次图图1.sysfs目录层次图其中涉及到ksets,kobjects,attrs等很多术语,这就不得不提到Linux统一设备模型。回页首Linux统一设备模型在Linux2.5内核的开发过程中,人们设计了一套新的设备模型,目的是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身和设备之间的连接关系。这个模型是在分析了PCI和USB的总线驱动过程中得到的,这两个总线类型能代表当前系统中的大多数设备类型,它们都有完善的热挺拔机制和电源管理的支持,也都有级连机制的支持,以桥接的PCI/USB总线控制器的方式可以支持更多的PCI/USB设备。为了给所有设备添加统一的电源管理的支持,而不是让每个设备中去独立实现电源管理的支持,人们考虑的是如何尽可能地重用代码;而且在有层次模型的PCI/USB总线中,必须以合理形式展示出这个层次关系,这也是电源管理等所要求的必须有层次结构。如在一个典型的PC系统中,中央处理器(CPU)能直接控制的是PCI总线设备,而USB总线设备是以一个PCI设备(PCI-USB桥)的形式接入在PCI总线设备上,外部USB设备再接入在USB总线设备上;当计算机执行挂起(suspend)操作时,Linux内核应该以“外部USB设备-USB总线设备-PCI总线设备”的顺序通知每一个设备

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功