1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 运维 - 正文

君子好学,自强不息!

简单介绍Linux sysfs 桌面操作系统

2022-11-14 | 运维 | 1818ip | 631°c
A+ A-

本人对Linux系统很感兴趣,常见Linux sysfs 属性的功能Linux本身是这个操作系统的核心部分,也就是操作系统的内核。内核是完成那些最基本操作的程序,它负责其他程序(如文本编辑器程序)的启动与终止、内存申请处理硬盘访问、网络连接管理等方面的工作。

使用 Linux 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 2001 Xorg 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/resource0 Xorg 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/config Xorg 2001 root 8u unix 0xdbe66000 0t0 8756 socket Xorg 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/config 00000000 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:6330 01: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 1b30 Flags: 66MHz, medium devsel BIST result: 00 Memory at d8000000 (32-bit, prefetchable) [size=128M] Memory at e1000000 (32-bit, non-prefetchable) [size=128K] I/O ports at d000 [size=128] Capabilities: [40] Power Management version 2 Capabilities: [50] AGP version 3.0

在 PCI 设备上除了有 config 是配置空间对用户的接口以外,还有 resource{0,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_bus lrwxrwxrwx 1 root root 0 12-09 00:28 subsystem -> ../../../../bus/pci drwxr-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 属性文件;关于纯文本属性和二进制属性,在下文 编程实践:添加Linux 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 核心对 Linux sysfs 的完善支持,每个设备甚至不用单独的驱动程序,如这里的 “0000:01:00.0” 不需要一个内核级的驱动程序,有了 PCI 核心对该设备的配置空间发现机制,可以自动发现它的各个不同段落的资源属性,在 Xorg 应用程序中可以直接以 “/usr/lib/xorg/modules/drivers/sis_drv.so” 这个用户空间的驱动程序对其进行映射,就可以直接操作此视频卡了;有了这一个 PCI 设备的示例可以知道,有了一个 PCI 设备的 /sys/devices/ 设备对象,去访问它的各项属性和设置属性都非常简单。以上介绍Linux sysfs桌面系统应用。

本文来源:1818IP

本文地址:https://www.1818ip.com/post/9368.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。