Linux内核,之proc, sys,sysfs设备模型(bus, device, driver)(一)

本文详细介绍了Linux系统中的/proc和/sys目录,这两个目录提供了访问内核数据结构和修改内核参数的途径。/proc包含进程信息、内存管理、系统控制参数等,而/sys专注于系统参数和内核模块的读写。通过举例说明如何查看和操作这些目录下的文件,如查看进程状态、内存信息、CPU信息等,展示了如何利用这些接口获取和调整系统信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、proc

内存管理
系统进程的特征数据
文件系统
设备驱动程序
系统总线
电源管理
终端
系统控制参数

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。

除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

1. /proc目录或子文件夹

/proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关
/proc/cmdline 启动时传递给kernel的参数信息
/proc/cpuinfo cpu的信息
/proc/crypto 内核使用的所有已安装的加密密码及细节
/proc/devices 已经加载的设备并分类
/proc/dma 已注册使用的ISA DMA频道列表
/proc/execdomains Linux内核当前支持的execution domains
/proc/fb 帧缓冲设备列表,包括数量和控制它的驱动
/proc/filesystems 内核当前支持的文件系统类型
/proc/interrupts x86架构中的每个IRQ中断数
/proc/iomem 每个物理设备当前在系统内存中的映射
/proc/ioports 一个设备的输入输出所使用的注册端口范围
/proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
/proc/locks 内核锁住的文件列表
/proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)
/proc/meminfo RAM使用的相关信息
/proc/misc 其他的主要设备(设备号为10)上注册的驱动
/proc/modules 所有加载到内核的模块列表
/proc/mounts 系统中使用的所有挂载
/proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)
/proc/partitions 分区中的块分配信息
/proc/pci 系统中的PCI设备列表
/proc/slabinfo 系统中所有活动的 slab 缓存信息
/proc/stat 所有的CPU活动信息
/proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的
/proc/uptime 系统已经运行了多久
/proc/swaps 交换空间的使用情况
/proc/version Linux内核版本和gcc版本
/proc/bus 系统总线(Bus)信息,例如pci/usb等
/proc/driver 驱动信息
/proc/fs 文件系统信息
/proc/ide ide设备信息
/proc/irq 中断请求设备信息
/proc/net 网卡设备信息
/proc/scsi scsi设备信息
/proc/tty tty设备信息
/proc/net/dev 显示网络适配器及统计信息
/proc/vmstat 虚拟内存统计信息
/proc/vmcore 内核panic时的内存映像
/proc/diskstats 取得磁盘信息
/proc/schedstat kernel调度器的统计信息
/proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用

以下是/proc目录中进程编号为,N的信息

/proc/N pid为N的进程信息
/proc/N/cmdline 进程启动命令
/proc/N/cwd 链接到进程当前工作目录
/proc/N/environ 进程环境变量列表
/proc/N/exe 链接到进程的执行命令文件
/proc/N/fd 包含进程相关的所有的文件描述符
/proc/N/maps 与进程相关的内存映射信息
/proc/N/mem 指代进程持有的内存,不可读
/proc/N/root 链接到进程的根目录
/proc/N/stat 进程的状态
/proc/N/statm 进程使用的内存的状态
/proc/N/status 进程状态信息,比stat/statm更具可读性
/proc/self 链接到当前正在运行的进程

如Ubuntu20.4系统的一个进程,有fd,fdinfo,等等。
在这里插入图片描述

1、查看进程cmdline
cat cmdline

/usr/lib/openssh/sftp-server

2、查看进程version
cat environ

SSH_CONNECTION=192.168.0.108 52245 192.168.0.107 22LANG=en_US.UTF-8XDG_SESSION_ID=10USER=wyPWD=/home/wyHOME=/home/wySSH_CLIENT=192.168.0.108 52245 22MAIL=/var/mail/wySHELL=/bin/bashSHLVL=1LOGNAME=wyDBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busXDG_RUNTIME_DIR=/run/user/1000PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin_=/usr/lib/openssh/sftp-server</pre>

4、查看进程状态status
cat status

Name:	sftp-server
Umask:	0002
State:	S (sleeping)
Tgid:	13079
Ngid:	0
Pid:	13079
PPid:	13078
TracerPid:	0
Uid:	1000	1000	1000	1000
Gid:	1000	1000	1000	1000
FDSize:	64
Groups:	4 24 27 30 46 116 126 1000 
NStgid:	13079
NSpid:	13079
NSpgid:	13079
NSsid:	13079
VmPeak:	   13156 kB
VmSize:	   13064 kB
VmLck:	       0 kB
...
SigQ:	0/31513
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000000000
SigCgt:	0000000000000000
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	0000003fffffffff
CapAmb:	0000000000000000
NoNewPrivs:	0
Seccomp:	0
Speculation_Store_Bypass:	thread vulnerable
Cpus_allowed:	ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:	0-127
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	32
nonvoluntary_ctxt_switches:	3

不仅提供了有关UID/GID及进程其他数值的信息,还包括内存分配、进程能力、各个信号掩码的状态(待决、阻塞,等等)

5、查看进程调度信息sched
cat sched

sftp-server (13079, #threads: 1)
se.exec_start                                :      17648570.034625
se.vruntime                                  :             2.310622
se.sum_exec_runtime                          :             3.507972
se.nr_migrations                             :                    0
nr_switches                                  :                   35
nr_voluntary_switches                        :                   32
nr_involuntary_switches                      :                    3
se.load.weight                               :              1048576
se.runnable_weight                           :              1048576
se.avg.load_sum                              :                  552
se.avg.runnable_load_sum                     :                  552
se.avg.util_sum                              :               523996
se.avg.load_avg                              :                   11
se.avg.runnable_load_avg                     :                   11
se.avg.util_avg                              :                   10
se.avg.last_update_time                      :       17648570034176
se.avg.util_est.ewma                         :                   10
se.avg.util_est.enqueued                     :                    0
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                   13
mm-&gt;numa_scan_seq                            :                    0
numa_pages_migrated                          :                    0
numa_preferred_nid                           :                   -1
total_numa_faults                            :                    0
current_node=0, numa_group_id=0
numa_faults node=0 task_private=0 task_shared=0 group_private=0 group_shared=0
</pre>

可以看到有时间,权重,这正是在CFS调度的时候用到的,具体调度分析参考进程CFS调度分析

三、操作例子

ls /proc/

1      16819  21242  2180   2494  8768         interrupts    partitions
116    16820  21244  2181   2524  885          iomem         sched_debug
11740  17901  21245  21810  2525  acpi         ioports       scsi
11742  17903  21247  21812  3     asound       irq           self
11743  17904  2131   21813  39    buddyinfo    kallsyms      slabinfo
13452  18362  21319  21923  4     bus          kcore         stat
13454  18364  2132   2193   41    cgroups      key-users     swaps
13455  18365  2139   21933  42    cmdline      kmsg          sys
149    19451  2142   2209   5     cpuinfo      kpagecount    sysrq-trigger
150    19453  21572  2212   5330  crypto       kpageflags    sysvipc
151    19454  21574  2219   596   devices      loadavg       timer_list
152    2      21575  2243   597   diskstats    locks         timer_stats
15771  2083   2158   2260   6     dma          meminfo       tty
15773  2092   21625  2261   617   driver       misc          uptime
15774  2101   21627  2262   619   execdomains  modules       version
16232  21112  21628  2263   7     fb           mounts        vmallocinfo
16234  21115  2165   2264   804   filesystems  mtrr          vmstat
16235  21116  2167   2265   8765  fs           net           zoneinfo
16811  2112   2177   2338   8767  ide          pagetypeinfo

3.2 /proc/sys
系统信息和内核参数 ls /proc/sys

debug  dev  fs  kernel  net  vm

3.3 /proc/net
网卡设备信息 ls /proc/net

anycast6   ip6_flowlabel  netfilter  raw6       sockstat6     udplite
arp        ip6_mr_cache   netlink    route      softnet_stat  udplite6
dev        ip6_mr_vif     netstat    rt6_stats  stat          unix
dev_mcast  ip_mr_cache    packet     rt_acct    tcp           vlan
dev_snmp6  ip_mr_vif      protocols  rt_cache   tcp6          wireless
if_inet6   ipv6_route     psched     snmp       tr_rif
igmp       mcfilter       ptype      snmp6      udp
igmp6      mcfilter6      raw        sockstat   udp6

3.4 /proc/scsi
SCSI设备信息 ls /proc/scsi

device_info scsi

3.5 /proc/modules
所有加载到内核的模块列表 cat /proc/modules

bdspboard 8486 2 dspcontrol, Live 0xe134c000
dspcontrol 9575 1 clkmon, Live 0xe135b000
clkmon 6765 1 - Live 0xe136c000
diagint 6635 1 - Live 0xe1379000
bdsprio 10775 2 srioif,tsi577, Live 0xe9389000
tsi577 17998 1 srioif, Live 0xe939e000
srioif 7329 0 - Live 0xe93b2000
linux_kernel_bde 54666 1 linux_user_bde, Live 0xf1417000 (P)
linux_user_bde 17849 0 - Live 0xf1427000 (P)

3.6 /proc/devices
已经加载的设备并分类 cat /proc/devices

Character devices:
1 mem
2 pty
3 ttyp
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
89 i2c
90 mtd
116 linux-user-bde2
117 linux-kernel-bde2
126 linux-user-bde
127 linux-kernel-bde
128 ptm
136 pts
180 usb
189 usb_device
245 ext_alarm
251 ipmidev
252 usb_endpoint
253 usbmon
254 rtc
 
Block devices:
1 ramdisk
8 sd
31 mtdblock
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd

3.7 /proc/partitions
分区中的块分配信息 cat /proc/partitions

major minor  #blocks  name
31        0        512 mtdblock0
31        1        512 mtdblock11
31        2     123904 mtdblock24
31        3       4096 mtdblock34
31        4       1024 mtdblock44
31        5       1024 mtdblock52
31        6        512 mtdblock26
31        7        512 mtdblock47
31        8     123904 mtdblock85
31        9       4096 mtdblock96
31       10       1024 mtdblock106
31       11       1024 mtdblock71
31       12    1048576 mtdblock72

或别的系统分区挂载情况

cat partitions 
major minor  #blocks  name
 253        0   11567104 vblkdev0
 253        1   11534336 vblkdev0p1
 253       32     262144 vblkdev22
 253       80    1048576 vblkdev51
 253       96    1572864 vblkdev36
 253      112     655360 vblkdev75
 253      128     655360 vblkdev38
 253      144     655360 vblkdev95
 253      160   10485760 vblkdev13
 253      176    2097152 vblkdev19
 253      192    1048576 vblkdev90
 253      208    1048576 vblkdev33
 253      240   33554432 vblkdev155
 253      256   19922944 vblkdev46
 253      272   16777216 vblkdev1


查看分区及挂载情况
root:/proc# df
Filesystem      1K-blocks    Used Available Use% Mounted on
/dev/vblkdev0p1  11223664 6593056   4037508  63% /
none             12555404       0  12555404   0% /dev
tmpfs            12691780    7896  12683884   1% /dev/shm
tmpfs             2538356   14144   2524212   1% /run
tmpfs                5120       0      5120   0% /run/lock
tmpfs            12691780       0  12691780   0% /sys/fs/cgroup
/dev/vblkdev1     1031256      84    962388   1% /svp
/dev/vblkdev16     1539104     120   1443960   1% /work/kr/pe
/dev/vblkdev37      646080      36    600220   1% /work/kr/pn
/dev/vblkdev28      646080      36    600220   1% /work/ekr/ma
/dev/vblkdev39      646080      36    600220   1% /work/r/plat
/dev/vblkdev15   10304824    1140   9763060   1% /work/zee
/dev/vblkdev1   16382844   45080  15482520   1% /logs
tmpfs             2538356       4   2538352   1% /run/user/1000

3.8 /proc/version
Linux内核版本和gcc版本- cat /proc/version

Linux version 2.6.34.6-WR4.0.0.0_standard ( satomi@CharlieBrown) (gcc version 4.4.1 (Wind River Linux Sourcery G++ 4.4-291) ) #1 SMP PREEMPT Fri Nov 26 16:07:47 CST 2010

3.9 /proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。可将这个值设置成有任意多个文件,并且能通过将一个新数字值写入该文件来更改该值。默认设置时4096。
改变内核的参数,用vi编辑或echo参数重定向到文件中。

cat /proc/sys/fs/file-max

4096

echo 8192 > /proc/sys/fs/file-max

cat /proc/sys/fs/file-max
8192  

如果优化了参数,则可以把它们写成添加到文件rc.local中,使它在系统启动时自动完成修改

3.10/proc/filesystems
此系统支持的文件系统 cat filesystems
如下,可以看到proc,证明proc是个虚伪文件系统,还有debugfs,sysfs,ext3,等这些熟悉的系统
在这里插入图片描述

3.11 /proc/cmdline
系统启动命令 cat cmdline

BOOT_IMAGE=/boot/vmlinuz-5.11.0-38-generic root=UUID=14a0147b-8454-4244-8e85-b866738aabd4 ro quiet splash

3.12 /proc/meminfo
内存信息:cat meminfo
(例如Ubuntu)

MemTotal:        6085824 kB
MemFree:          225896 kB
MemAvailable:    4084604 kB
Buffers:          584644 kB
Cached:          3582008 kB
SwapCached:          212 kB
Active:          2120080 kB
Inactive:        3249936 kB
Active(anon):       3536 kB
Inactive(anon):  1244512 kB
Active(file):    2116544 kB
Inactive(file):  2005424 kB
Unevictable:          24 kB
Mlocked:              24 kB
SwapTotal:       2097148 kB
SwapFree:        2093052 kB
Dirty:                48 kB
Writeback:             0 kB
AnonPages:       1203208 kB
Mapped:           447936 kB
Shmem:             53120 kB
KReclaimable:     248812 kB
Slab:             357252 kB
SReclaimable:     248812 kB
SUnreclaim:       108440 kB
KernelStack:       14560 kB
PageTables:        24644 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5140060 kB
Committed_AS:    6517748 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       40992 kB
VmallocChunk:          0 kB
Percpu:             3984 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      323456 kB
DirectMap2M:     5967872 kB
DirectMap1G:     2097152 kB

3.12 /proc/kmsg
例如Ubuntu系统启动内核log信息: 输入dmesg

下面是一部分信息,太多了,启动时显示log图片,设置堆栈,设置文件系统,挂载,注册鼠标,键盘,usb驱动等等,

[    0.000000] Linux version 5.11.0-38-generic (buildd@lgw01-amd64-041) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #42~20.04.1-Ubuntu SMP Tue Sep 28 20:41:07 UTC 2021 (Ubuntu 5.11.0-38.42~20.04.1-generic 5.11.22)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.11.0-38-generic root=UUID=14a0147b-8454-4244-8e85-b866738aabd4 ro quiet splash
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Hygon HygonGenuine

[    0.028672] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.028736] mem auto-init: stack:off, heap alloc:on, heap free:off
[    0.058967] Memory: 6022132K/6290936K available (14345K kernel code, 3478K rwdata, 5460K rodata, 2688K init, 5976K bss, 268544K reserved, 0K cma-reserved)
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    0.706961] ACPI: Power Button [PWRF]
[    0.707395] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
vhci_hcd: register platform_driver usb_vhci_hcd
[50867.758491] usb_vhci_iocifc: User-mode IOCTL-interface for USB VHCI -- Version 1.15 (2021-10-22)
[50867.758492] usb_vhci_iocifc: register platform_driver usb_vhci_iocifc
[50867.758512] usb_vhci_iocifc: Successfully registered the character device.
[50867.758513] usb_vhci_iocifc: The major device number is 238.
[50867.758594] usb_vhci_iocifc: USB_VHCI_HCD_IOCREGISTER     = c0208a00
[50867.758595] usb_vhci_iocifc: USB_VHCI_HCD_IOCPORTSTAT     = 40088a01
[50867.758596] usb_vhci_iocifc: USB_VHCI_HCD_IOCFETCHWORK_RO = 80288a02
[50867.758597] usb_vhci_iocifc: USB_VHCI_HCD_IOCFETCHWORK    = c0288a02
[50867.758597] usb_vhci_iocifc: USB_VHCI_HCD_IOCGIVEBACK     = 40288a03
[50867.758598] usb_vhci_iocifc: USB_VHCI_HCD_IOCFETCHDATA    = 40208a04
[50867.929661] usb_vhci_hcd usb_vhci_hcd.0: USB Virtual Host Controller Interface -- Version 1.15 (2021-10-22)
[50867.929666] usb_vhci_hcd usb_vhci_hcd.0: --> Backend: USB VHCI user-mode IOCTL-interface
[50867.929676] usb_vhci_hcd usb_vhci_hcd.0: VHCI Host Controller
[50867.929688] usb_vhci_hcd usb_vhci_hcd.0: new USB bus registered, assigned bus number 1
[50867.929698] usb_vhci_hcd: hcd will use irq 0
[50867.929755] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.11
[50867.929759] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[50867.929761] usb usb1: Product: VHCI Host Controller
[50867.929762] usb usb1: Manufacturer: Linux 5.11.0-38-generic usb_vhci_hcd
[50867.929764] usb usb1: SerialNumber: usb_vhci_hcd.0
[50867.929896] hub 1-0:1.0: USB hub found
[50867.929903] hub 1-0:1.0: 15 ports detected

3.13 /proc/sys/kernel/printk

该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请阅读 syslog(2) 联机帮助页。该文件的四个值为:

控制台日志级别:优先级高于该值的消息将被打印至控制台
缺省的消息日志级别:将用该优先级来打印没有优先级的消息
最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
缺省的控制台日志级别:控制台日志级别的缺省值

3.14 /proc/cpuinfo 看当前CPU

cat /proc/cpuinfo 

processor : 0
model name : ARMv8 Processor rev 1 (v8l)
BogoMIPS : 62.50
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp uscat ilrcpc flagm
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd42
CPU revision : 1

processor : 1
model name : ARMv8 Processor rev 1 (v8l)
BogoMIPS : 62.50
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp uscat ilrcpc flagm
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd42
CPU revision : 1

看当前Linux系统有几颗物理CPU

cat /proc/cpuinfo|grep -c 'physical id'

4

看当前Linux系统每颗CPU的核数

cat /proc/cpuinfo|grep -c 'processor'

4

二、/sys目录

有block bus class dev devices firmware fs kernel module power
/sys/devices (/sys文件系统最重要的目录结构)
该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。

/sys/dev
该目录下有字符设备(block)和块设备(char)两个子目录,里面全是以主次设备号(major:minor)命名的链接文件,链接到/sys/devices。

/sys/class (按功能分类设备)
该目录下包含所有注册在kernel里面的设备类型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下是具体设备的符号链接,这些链接指向/sys/devices/…下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)

/sys/block (从linux2.6.26版本开始已经移到了/sys/class/block)
代表着系统中当前被发现的所有块设备。按照功能来说防止在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。

/sys/bus (按总线类型分类设备)
一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/…下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。 (它也是构成linux统一设备模型的一部分)

/sys/module
该目录包含所有被载入Kernel的模块,无论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件)

/sys/fs
该目录用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。

/sys/kernel
该目录下存放的是内核中所有可调整的参数

/sys/firmware
该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口.(关于固件有专用于固件加载的一套API)

/sys/power
该目录下有几个属性文件可以用于控制整个机器的电源状态,如向其中写入控制命令让机器关机/重启等等。

后面继续补充

四、/sysfs(bus, device, driver)
在这里插入图片描述

在这里插入图片描述

原文链接:https://blog.csdn.net/mxgsgtc/article/details/62042436

<think>好的,用户想了解Linux内核设备模型的相关概念和实现。我需要先回忆Linux设备模型的基本结构。记得设备模型主要是为了管理系统中所有的设备、驱动和总线,提供统的框架。 首先,应该从设备模型的核心结构开始,比如kobject、kset、ktype这些基础组件。kobject是设备模型的基础,用来实现引用计数和sysfs接口。kset是kobject的集合,而ktype定义了对象的操作方式。这部分需要详细说明,但要注意用中文,并且数学公式要用$...$格式。 接下来是总线、设备和驱动的关联。总线类型结构体bus_type,设备结构体device,驱动结构体device_driver,以及它们如何通过注册和匹配过程协同工作。比如设备注册时如何与驱动匹配,可能需要提到match函数和probe函数的触发。 然后,sysfs文件系统的作用,它是如何将内核对象导出到用户空间的。需要说明kobject与sysfs目录的关系,属性文件的创建和访问。这部分可能涉及到用户挂载procsysfs的问题,引用中的信息[^3]提到需要手动挂载,可以引用下。 设备模型的热插拔支持也是重点,比如uevent事件如何通知用户空间,以及mdev或udev如何响应这些事件创建设备节点。引用中的mdev -s命令可能与此相关,需要提及。 还有电源管理和设备间的层次结构,比如设备作为父设备的子对象,形成树状结构。这部分可能涉及设备树(Device Tree)的概念,但设备树更多是硬件描述,设备模型更侧重软件管理。 最后,需要生成相关问题。根据用户提供的示例,问题应该围绕实现机制、sysfs的作用、热插拔处理、与设备树的区别,以及电源管理等方面展开。 检查是否有遗漏的部分,比如是否提到kobject的生命周期管理,sysfs的属性操作,以及实际代码中的结构体例子。同时确保所有技术术语准确,并正确引用提供的参考资料,特别是关于sysfs挂载和mdev的部分[^3]。</think>### Linux内核设备模型架构与实现 Linux内核设备模型Device Model)是管理硬件设备、驱动程序和总线关系的核心框架,主要实现以下功能: 1. 统设备层次结构表示 2. 支持热插拔操作 3. 提供sysfs虚拟文件系统接口 4. 实现电源管理基础 #### 1. 核心数据结构 设备模型基于以下基础组件: - **kobject**:设备模型的原子单位,实现: - 引用计数(通过$kref$结构) - sysfs目录项关联 - 父子关系维护 - **kset**:kobject集合容器,用于组织同类设备 - **ktype**:定义kobject的释放操作(通过$release()$函数) 设备模型继承关系可表示为: $$ \text{kobject} \rightarrow \text{device} \rightarrow \text{bus/class} $$ #### 2. 总线-设备-驱动关联 实现机制包含三个核心结构: 1. **bus_type**:描述总线类型 ```c struct bus_type { const char *name; int (*match)(struct device *dev, struct device_driver *drv); struct subsys_private *p; }; ``` 2. **device**:表示物理/逻辑设备 3. **device_driver**:驱动程序抽象 注册流程示例: ```c // 设备注册 device_register(&my_device); // 驱动注册 driver_register(&my_driver); ``` 注册时内核会调用总线类型的$match()$函数进行匹配,成功则触发$probe()$函数[^1]。 #### 3. sysfs集成 每个kobject对应sysfs中的个目录,属性通过以下方式创建: ```c static struct attribute_group dev_attr_group = { .attrs = dev_attributes, }; sysfs_create_group(&dev->kobj, &dev_attr_group); ``` 用户可通过$cat /sys/devices/...$访问设备属性。 #### 4. 热插拔支持 设备模型通过uevent机制通知用户空间: ```c kobject_uevent(&dev->kobj, KOBJ_ADD); ``` 用户空间的udev/mdev收到事件后,根据$MAJOR/MINOR$号创建设备节点: ```shell mdev -s # 重新扫描设备 ``` #### 5. 设备层次结构 设备间形成树状结构: ```c device_create(parent_dev, ...); ``` 这种结构支持: - 电源管理传播 - 资源继承 - 生命周期管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值