




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用 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_status enable modalias resource0 rom ueventclass irq msi_bus resource0_wc subsystem vendorconfig local_cpulist power/ resource1 subsystem_devicedevice local_cpus resource resource2 subsystem_vendor这是在 Fedora 10 的 2.6.27.5-117.fc10.i686 的内核上,可以看到在 /sys 目录下有 block, bus, class, dev, devices, firmware, fs, kernel, module, power 这些子目录,本文将分别介绍这些目录存在的含义。第二个 ls 命令展示了在一个 pci 设备目录下的文件, ls 命令的 -F 命令为所列出的每个文件使用后缀来显示文件的类型,后缀 / 表示列出的是目录,后缀 表示列出的是符号链接文件。可以看到第二个目录下包含有普通文件 (regular file) 和符号链接文件 (symbolic link file) ,本文也将以这个具体的设备为例说明其中每一个普通文件的用途。回页首/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/, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等; 编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的 /sys/module/, 这些模块的可用参数会出现在 /sys/modules/parameters/ 中, o 如 /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀;o 所有内联模块的参数也可以由 .= 的形式写在内核启动参数上,如启动内核时加上参数 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(Unqueued Slab Allocator)被设置为缺省值;如果编译了此选项,在 /sys 下就会出现 /sys/slab ,里面有每一个 kmem_cache 结构体的可调整参数。对应于旧的 SLAB 内存分配器下的 /proc/slabinfo 动态调整接口,新式的 /sys/kernel/slab/ 接口中的各项信息和可调整项显得更为清晰。接下来对 /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/ device local_cpus power/ subsystem_vendorbroken_parity_status enable modalias resource ueventclass irq msi_bus subsystem vendorconfig local_cpulist pci_bus/ subsystem_device可以看到,其中有一个目录 0000:01:00.0/, 其它都是属性文件和属性组,而如果对 0000:01:00.0/ 子目录中进行再列表查看则会得到 清单 1 的目录结构。继续以上过程可以了解整个目录树的结构,这里把它整理成 图 1. sysfs 目录层次图图 1. sysfs 目录层次图其中涉及到 ksets, kobjects, attrs 等很多术语,这就不得不提到 Linux 统一设备模型。回页首Linux 统一设备模型在 Linux 2.5 内核的开发过程中,人们设计了一套新的设备模型,目的是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身和设备之间的连接关系。这个模型是在分析了 PCI 和 USB 的总线驱动过程中得到的,这两个总线类型能代表当前系统中的大多数设备类型,它们都有完善的热挺拔机制和电源管理的支持,也都有级连机制的支持,以桥接的 PCI/USB 总线控制器的方式可以支持更多的 PCI/USB 设备。为了给所有设备添加统一的电源管理的支持,而不是让每个设备中去独立实现电源管理的支持,人们考虑的是如何尽可能地重用代码;而且在有层次模型的 PCI/USB 总线中,必须以合理形式展示出这个层次关系,这也是电源管理等所要求的必须有层次结构。如在一个典型的 PC 系统中,中央处理器(CPU)能直接控制的是 PCI 总线设备,而 USB 总线设备是以一个 PCI 设备(PCI-USB桥)的形式接入在 PCI 总线设备上,外部 USB 设备再接入在 USB 总线设备上;当计算机执行挂起(suspend)操作时, Linux 内核应该以 “外部USB设备-USB总线设备-PCI总线设备” 的顺序通知每一个设备将电源挂起;执行恢复(resume)时则以相反的顺序通知;反之如果不按此顺序则将有设备得不到正确的电源状态变迁的通知,将无法正常工作。sysfs 是在这个 Linux 统一设备模型的开发过程中的一项副产品(见 参考资料 中 Greg K. Hartman 写作的 LinuxJournal 文章)。为了将这些有层次结构的设备以用户程序可见的方式表达出来,人们很自然想到了利用文件系统的目录树结构(这是以 UNIX 方式思考问题的基础,一切都是文件!)在这个模型中,有几种基本类型,它们的对应关系见 表 2. Linux 统一设备模型的基本结构 :表 2. Linux 统一设备模型的基本结构类型所包含的内容对应内核数据结构对应/sys项设备(Devices)设备是此模型中最基本的类型,以设备本身的连接按层次组织struct device/sys/devices/*/*/./设备驱动(Device Drivers)在一个系统中安装多个相同设备,只需要一份驱动程序的支持struct device_driver/sys/bus/pci/drivers/*/总线类型(Bus Types)在整个总线级别对此总线上连接的所有设备进行管理struct bus_type/sys/bus/*/设备类别(Device Classes)这是按照功能进行分类组织的设备层次树;如 USB 接口和 PS/2 接口的鼠标都是输入设备,都会出现在 /sys/class/input/ 下struct class/sys/class/*/从内核在实现它们时所使用的数据结构来说, Linux 统一设备模型又是以两种基本数据结构进行树型和链表型结构组织的: kobject: 在 Linux 设备模型中最基本的对象,它的功能是提供引用计数和维持父子(parent)结构、平级(sibling)目录关系,上面的 device, device_driver 等各对象都是以 kobject 基础功能之上实现的; struct kobject const char *name; struct list_head entry; struct kobject *parent; struct kset *kset; struct kobj_type *ktype; struct sysfs_dirent *sd; struct kref kref; unsigned int state_initialized:1;unsigned int state_in_sysfs:1; unsigned int state_add_uevent_sent:1; unsigned int state_remove_uevent_sent:1; 其中 struct kref 内含一个 atomic_t 类型用于引用计数, parent 是单个指向父节点的指针, entry 用于父 kset 以链表头结构将 kobject 结构维护成双向链表; kset: 它用来对同类型对象提供一个包装集合,在内核数据结构上它也是由内嵌一个 kboject 实现,因而它同时也是一个 kobject (面向对象 OOP 概念中的继承关系) ,具有 kobject 的全部功能; struct kset struct list_head list; spinlock_t list_lock; struct kobject kobj; struct kset_uevent_ops *uevent_ops; 其中的 struct list_head list 用于将集合中的 kobject 按 struct list_head entry 维护成双向链表; 涉及到文件系统实现来说, sysfs 是一种基于 ramfs 实现的内存文件系统,与其它同样以 ramfs 实现的内存文件系统(configfs,debugfs,tmpfs,.)类似, sysfs 也是直接以 VFS 中的 struct inode 和 struct dentry 等 VFS 层次的结构体直接实现文件系统中的各种对象;同时在每个文件系统的私有数据 (如 dentry-d_fsdata 等位置) 上,使用了称为 struct sysfs_dirent 的结构用于表示 /sys 中的每一个目录项。struct sysfs_dirent atomic_t s_count; atomic_t s_active; struct sysfs_dirent *s_parent; struct sysfs_dirent *s_sibling; const char *s_name; union struct sysfs_elem_dir s_dir; struct sysfs_elem_symlink s_symlink; struct sysfs_elem_attr s_attr; struct sysfs_elem_bin_attr s_bin_attr; ; unsigned int s_flags; ino_t s_ino; umode_t s_mode; struct iattr *s_iattr; 在上面的 kobject 对象中可以看到有向 sysfs_dirent 的指针,因此在sysfs中是用同一种 struct sysfs_dirent 来统一设备模型中的 kset/kobject/attr/attr_group. 具体在数据结构成员上, sysfs_dirent 上有一个 union 共用体包含四种不同的结构,分别是目录、符号链接文件、属性文件、二进制属性文件;其中目录类型可以对应 kobject,在相应的 s_dir 中也有对 kobject 的指针,因此在内核数据结构, kobject 与 sysfs_dirent 是互相引用的;有了这些概念,再来回头看 图 1. sysfs 目录层次图 所表达的 /sys 目录结构就是非常清晰明了: 在 /sys 根目录之下的都是 kset,它们组织了 /sys 的顶层目录视图; 在部分 kset 下有二级或更深层次的 kset; 每个 kset 目录下再包含着一个或多个 kobject,这表示一个集合所包含的 kobject 结构体; 在 kobject 下有属性(attrs)文件和属性组(attr_group),属性组就是组织属性的一个目录,它们一起向用户层提供了表示和操作这个 kobject 的属性特征的接口; 在 kobject 下还有一些符号链接文件,指向其它的 kobject,这些符号链接文件用于组织上面所说的 device, driver, bus_type, class, module 之间的关系; 不同类型如设备类型的、设备驱动类型的 kobject 都有不同的属性,不同驱动程序支持的 sysfs 接口也有不同的属性文件;而相同类型的设备上有很多相同的属性文件;注意,此表内容是按照最新开发中的 2.6.28 内核的更新组织的,在附录资源如 LDD3 等位置中有提到 sysfs 中曾有一种管理对象称为 subsys (子系统对象),在最新的内核中经过重构认为它是不需要的,它的功能完全可以由 kset 代替,也就是说 sysfs 中只需要一种管理结构是 kset,一种代表具体对象的结构是 kobject,在 kobject 下再用属性文件表示这个对象所具有的属性;回页首常见 sysfs 属性的功能使用 sysfs 的关键就是掌握这些 sysfs 属性的用法,下面以一些常见的 sysfs 属性来展示它的用法;使用设备(PCI)的 sysfs 属性文件以一份桌面系统上的视频卡为例,列举它对应的 kobject 上的属性文件的对应用途;一般来说,在 Linux 桌面上都有视频卡以支持 Xorg 软件包作为 XWindow 服务器来运行,因此先找到 Xorg 的进程号,查看这个进程所使用的所有文件(注意查看这个进程属性需要 root 用户权限);# ps xfa |grep Xorg 2001 tty1 Ss+ 2:24 _ /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-NPrkZK/database -nolisten tcp vt1# lsof -nP -p 2001Xorg 2001 root mem REG 8,3 617732 231033 /usr/lib/xorg/modules/drivers/sis_drv.so.Xorg 2001 root mem REG 0,0 134217728 5529 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource0Xorg 2001 root mem REG 0,0 131072 5531 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource1.Xorg 2001 root 7u REG 0,0 256 5504 /sys/devices/pci0000:00/0000:00:00.0/configXorg 2001 root 8u unix 0xdbe66000 0t0 8756 socketXorg 2001 root 9u REG 0,0 256 5528 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/config注意到此 Xorg 服务器是以内存映射 (mem) 的形式打开了 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource0 和 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource1 ,同时以文件读写形式 (7u,9u) 打开了 /sys/devices/pci0000:00/0000:00:00.0/config 和 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/config 事实上, PCI 设备对应的 kobject 目录下的 config 正是代表PCI设备的“配置空间”,对于普通 PCI (非PCI-E)设备而言,其配置空间大小一般是 256字节,这个空间可以使用十六进制工具 dump 出来,如下。(有关 PCI 设备本身的三种地址空间,请参考附录 LDD3)# hexdump -C /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/config00000000 39 10 30 63 03 00 30 02 00 00 00 03 00 00 00 80 |9.0c.0.|00000010 08 00 00 d8 00 00 00 e1 01 d0 00 00 00 00 00 00 |.|00000020 00 00 00 00 00 00 00 00 00 00 00 00 19 10 30 1b |.0.|00000030 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 |.|00000040 01 50 02 06 00 00 00 00 00 00 00 00 00 00 00 00 |.P.|00000050 02 00 30 00 0b 02 00 ff 00 00 00 00 00 00 00 00 |.0.|00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.|*00000100 这个空间正好是 256字节大小,熟悉 PCI 的人们还可以知道,从 PCI 配置空间可以读到有关此 PCI 设备的很多有用信息,如厂商代码,设备代码,IRQ 号码等;前四个字节 0x39 0x10 0x30 0x63 就是按小端(little endian)存放的2个短整数,因此其 PCI 厂商号码和 PCI 设备号码分别是 0x1039 和 0x6330# lspci -v -d 1039:633001:00.0 VGA compatible controller: Silicon Integrated Systems SiS 661/741/760 PCI/AGP or 662/761Gx PCIE VGA Display Adapter (prog-if 00 VGA controller)Subsystem: Elitegroup Computer Systems Device 1b30Flags: 66MHz, medium devselBIST result: 00Memory at d8000000 (32-bit, prefetchable) size=128MMemory at e1000000 (32-bit, non-prefetchable) size=128KI/O ports at d000 size=128Capabilities: 40 Power Management version 2Capabilities: 50 AGP version 3.0 在 PCI 设备上除了有 config 是配置空间对用户的接口以外,还有 resource0,1,2,. 是资源空间,对应着 PCI 设备的可映射内存空间;此外 PCI 设备还提供了很多接口,全部列表如下:# ls -lU /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/总计 0-rw-r-r- 1 root root 4096 12-09 00:28 uevent-r-r-r- 1 root root 4096 12-09 00:27 resource-r-r-r- 1 root root 4096 12-09 00:27 vendor-r-r-r- 1 root root 4096 12-09 00:27 device-r-r-r- 1 root root 4096 12-09 00:28 subsystem_vendor-r-r-r- 1 root root 4096 12-09 00:28 subsystem_device-r-r-r- 1 root root 4096 12-09 00:27 class-r-r-r- 1 root root 4096 12-09 00:27 irq-r-r-r- 1 root root 4096 12-09 00:28 local_cpus-r-r-r- 1 root root 4096 12-09 00:28 local_cpulist-r-r-r- 1 root root 4096 12-09 00:28 modalias-rw- 1 root root 4096 12-09 00:28 enable-rw-r-r- 1 root root 4096 12-09 00:28 broken_parity_status-rw-r-r- 1 root root 4096 12-09 00:28 msi_buslrwxrwxrwx 1 root root 0 12-09 00:28 subsystem - ././././bus/pcidrwxr-xr-x 2 root root 0 12-09 00:28 power-rw-r-r- 1 root root 256 12-08 23:03 config-rw- 1 root root 134217728 12-08 23:03 resource0-rw- 1 root root 134217728 12-09 00:28 resource0_wc-rw- 1 root root 131072 12-08 23:03 resource1-rw- 1 root root 128 12-09 00:28 resource2-r- 1 root root 0 12-09 00:28 rom 可以看到很多其它属性文件,这些属性文件的权限位也都是正确的,有 w 权限位的才是可以写入。其中大小为 4096字节的属性一般是纯文本描述的属性,可以直接 cat 读出和用 echo 字符串的方法写入;其它非 4096字节大小的一般是二进制属性,类似于上面的 config 属性文件;关于纯文本属性和二进制属性,在下文 编程实践:添加sysfs支持 一节会进一步说明。 从 vendor, device, subsystem_vendor, subsystem_device, class, resource 这些只读属性上分别可以读到此 PCI 设备的厂商号、设备号、子系统厂商号、子系统设备号、PCI类别、资源表等,这些都是相应 PCI 设备的属性,其实就是直接从 config 二进制文件读出来,按照配置空间的格式读出这些号码; 使用 enable 这个可写属性可以禁用或启用这个 PCI 设备,设备的过程很直观,写入1代表启用,写入0则代表禁用; subsystem 和 driver 符号链接文件分别指向对应的 sysfs 位置;(这里缺少 driver 符号链接说明这个设备当前未使用内核级的驱动程序) resource0, resource0_wc, resource1, resource2 等是从PCI 配置空间解析出来的资源定义段落分别生成的,它们是 PCI 总线驱动在 PCI 设备初始化阶段加上去的,都是二进制属性,但没有实现读写接口,只支持 mmap 内存映射接口,尝试进行读写会提示 IO 错误,其中 _wc 后缀表示 合并式写入(write combined) ,它们用于作应用程序的内存映射,就可以访问对应的 PCI 设备上相应的内存资源段落;有了 PCI 核心对 sysfs 的完善支持,每个设备甚至不用单独的驱动程序,如这里的 0000:01:00.0 不需要一个内核级的驱动程序,有了 PCI 核心对该设备的配置空间发现机制,可以自动发现它的各个不同段落的资源属性,在 Xorg 应用程序中可以直接以 /usr/lib/xorg/modules/drivers/sis_drv.so 这个用户空间的驱动程序对其进行映射,就可以直接操作此视频卡了;有了这一个 PCI 设备的示例可以知道,有了一个 PCI 设备的 /sys/devices/ 设备对象,去访问它的各项属性和设置属性都非常简单。使用 uevent在 sysfs 下的很多 kobject 下都有 uevent 属性,它主要用于内核与 udev (自动设备发现程序)之间的一个通信接口;从 udev 本身与内核的通信接口 netlink 协议套接字来说,它并不需要知道设备的 uevent 属性文件,但多了 uevent 这样一个接口,可用于 udevmonitor 通过内核向 udevd (udev 后台程序)发送消息,也可用于检查设备本身所支持的 netlink 消息上的环境变量,这个特性一般用于开发人员调试 udev 规则文件, udevtrigger 这个调试工具本身就是以写各设备的 uevent 属性文件实现的。这些 uevent 属性文件一般都是可写的,其中 /sys/devices/ 树下的很多 uevent 属性在较新内核下还支持可读:# find /sys/ -type f -name uevent -ls 11 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/uevent 1471 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/pcspkr/uevent 3075 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/vesafb.0/uevent 3915 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/serial8250/uevent 3941 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/serial8250/tty/ttyS2/uevent 3950 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/serial8250/tty/ttyS3/uevent 5204 0 -rw-r-r- 1 root root 4096 12月 12 21:10 /sys/devices/platform/i8042/uevent. 912 0 -rw-r-r- 1 root root 4096 12月 12 21:17 /sys/devices/pci0000:00/0000:00:02.5/uevent. 上面截取的最后一个是 SCSI 硬盘控制器设备的 uevent 属性文件,这些 /devices/ 属性文件都支持写入,当前支持写入的参数有 add,remove,change,move,online,offline。如,写入 add,这样可以向 udevd 发送一条 netlink 消息,让它再重新一遍相关的 udev 规则文件;这个功能对开发人员调试 udev 规则文件很有用。# echo add /sys/devices/pci0000:00/0000:00:02.5/uevent 使用驱动(PCI)的 sysfs 属性文件, bind, unbind 和 new_id在设备驱动 /sys/bus/*/driver/. 下可以看到很多驱动都有 bind, unbind, new_id 这三个属性,# find /sys/bus/*/drivers/ -name bind -ls. 每一个设备驱动程序在程序内以某种方式注明了可用于哪些硬件,如所有的 PCI 驱动都使用 MODULE_DEVICE_TABLE 声明了所能驱动的 PCI 硬件的 PCI 设备号。但驱动程序不能预知未来,未来生产的新的硬件有可能兼容现有硬件的工作方式,就还可以使用现有硬件驱动程序来工作。在 bind 和 unbind 发明以前,这种情况除了修改 PCI 设备驱动程序的 DEVICE_TABLE 段落,重新编译驱动程序,以外别无他法,在 2.6 内核上添加了 bind 和 unbind 之后可以在不重新编译的情况下对设备和驱动之间进行手工方式地绑定。而且对于有些硬件设备可以有多份驱动可用,但任何具体时刻只能有一个驱动程序来驱动这个硬件,这时可以使用 bind/unbind 来强制使用和不使用哪一个驱动程序;(注意关于多种驱动程序的选择,更好的管理方法是使用 modprobe.conf 配置文件,需要重启才生效,而 bind/unbind 提供的是一种临时的无需重启立即生效的途径;)使用它们可以强制绑定某个设备使用或强制不使用某个驱动程序,操作方法就是通过 bind 和 unbind 接口。# find /sys/ -type f ( -name bind -or -name unbind -or -name new_id ) -ls 69 0 -rw-r-r- 1 root root 4096 12月 12 22:12 /sys/devices/virtual/vtconsole/vtcon0/bind 3072 0 -w- 1 root root 4096 12月 12 22:15 /sys/bus/platform/drivers/vesafb/unbind. 6489 0 -w- 1 root root 4096 12月 12 22:09 /sys/bus/pci/drivers/8139too/unbind 6490 0 -w- 1 root root 4096 12月 12 22:09 /sys/bus/pci/drivers/8139too/bind 6491 0 -w- 1 root root 4096 12月 12 22:15 /sys/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年心理健康心理健康评估与干预知识检测试卷答案及解析
- 2025年皮肤病学科临床表现鉴定竞赛答案及解析
- 2025年传染科肠道传染病病原检出技术选择与应用试卷答案及解析
- 2025年家庭医学家庭医生服务技能评测答案及解析
- 2025年整体医学中医药与西医结合病例评估测试答案及解析
- 民族团结教育课件
- 2025年齿科口腔种植术后护理知识温习考试卷答案及解析
- 新质生产力的核心支撑要素解析
- 2025年消化内科患者的腹泻护理模拟测试卷答案及解析
- 2025年眼科学科视网膜剥离手术技能检测答案及解析
- 北师大版七年级数学上册《生活中的立体图形》第2课时示范公开课教学课件
- 耳尖放血课件完整版
- 手术病人病情观察能力培养业务学习专家讲座
- GB/T 14715-2017信息技术设备用不间断电源通用规范
- 起重设备安装安全事故应急预案
- 教研组、备课组新学期教研组长会议课件讲义
- 物流网络规划与设计课件
- JB∕T 5245.4-2017 台式钻床 第4部分:技术条件
- 鞘膜积液的护理查房
- 《水工监测工》习题集最新测试题含答案
- 部编版三年级上册道德与法治第一单元第1课《学习伴我成长》课件
评论
0/150
提交评论