常見 sysfs 屬性的功能
使用 sysfs 的關鍵就是掌握這些 sysfs 屬性的用法,下面以一些常見的 sysfs 屬性來展示它的用法;
使用裝置(pci)的 sysfs 屬性檔案
# ps xfa |grep xorg2001 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/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 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 是資源空間,對應著 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 屬性檔案;關於純文字屬性和二進位制屬性,在下文 程式設計實踐:新增sysfs支援 一節會進一步說明。
有了這乙個 pci 裝置的示例可以知道,有了乙個 pci 裝置的 /sys/devices/ 裝置物件,去訪問它的各項屬性和設定屬性都非常簡單。
Linux 核心 sys 檔案系統介紹5
使用 scsi host 的 scan 屬性 在具有使用 scsi 匯流排連線的主機上,與 pci類似的是也採用四個號碼作為一組來描述乙個裝置,其中位於最頂層的是 scsi host。我們從裝置類別 class 為起點來探索 ls lu sys class scsi host 總計 0 lrwxrw...
efi的sys檔案系統介面
在driver firmware efi efi.c 中通過subsys initcall efisubsys init 來初始化efisubsys static int init efisubsys init void error generic ops register if error got...
linux核心檔案系統燒寫
1.製作並燒寫檔案系統 1 busybox的安裝 把busybox的壓縮包放到linux系統下 解壓縮 make menuconfig make make後會在 install下生成bin linuxrc sbin usr,把這些資料夾放到根系統中 2 把root mkfs的壓縮包解壓,然後修改ro...