Linux 内核:节点创建汇总
Linux 内核:节点创建体系
创建节点
/proc(进程/系统状态暴露)
创建 API:
proc_create()
、proc_create_data()
、remove_proc_entry()
典型路径:
进程专属:
/proc/[pid]/stat
(进程状态)、/proc/[pid]/cmdline
(启动参数)系统参数:
/proc/sys/net/core/somaxconn
(网络队列长度)设备相关:
/proc/misc
(杂项设备)、/proc/devices
(设备号注册)驱动调试:
/proc/driver/xxx
(驱动自定义调试节点)内核默认:
/proc/cpuinfo
(CPU 信息)、/proc/modules
(模块列表)
/sys(内核对象层次化管理)
核心机制:
kobject
模型 +sysfs
属性创建方式:
设备类:
class_create()
+device_create()
→ 生成/sys/class/xxx
(关联/dev
节点)补充:生成
/sys/class/xxx
(关联/dev
节点)也就是/sys/class/dev_class/dev,dev 可以添加
用DEVICE_ATTR
宏自定义属性,结果变成了 /sys/class/dev_class/dev/stat
内核对象:
kobject_create_and_add()
+sysfs_create_file()
→ 生成/sys/kernel/xxx
(自定义节点)自动节点:内核设备模型生成(
/sys/devices
设备拓扑、/sys/bus
总线驱动、/sys/module
模块信息)
典型路径:
网络设备:
/sys/class/net/eth0/address
(MAC 地址)块设备:
/sys/block/sda/size
(磁盘容量)内核调试:
/sys/kernel/debug
(debugfs 挂载点,需单独挂载)
debugfs(调试专用,挂载于
/sys/kernel/debug
)创建 API:
debugfs_create_dir()
、debugfs_create_file()
、debugfs_remove_recursive()
典型场景:
性能追踪:
/sys/kernel/debug/tracing
(ftrace 调试)硬件调试:
/sys/kernel/debug/usb/usbmon
(USB 抓包)自定义调试:
/sys/kernel/debug/my_debug/val
(驱动内部状态暴露)
configfs(动态配置,挂载于
/config
)创建 API:
configfs_register_subsystem()
、config_item_init()
典型场景:
USB 设备:
/config/usb_gadget
(动态配置虚拟 USB 设备)网络配置:
/config/netdev
(模拟动态网络设备参数)
/dev(设备文件,用户空间接口)
创建方式:
自动:内核驱动通过
class + device_create
触发 udev/mdev 创建设备节点(如/dev/mychar
)手动:
mknod
命令(如mknod /dev/xxx c 123 0
创建设备文件)
设备类型:
字符设备(
c
):/dev/tty
(终端)、/dev/zero
(虚拟设备)块设备(
b
):/dev/sda
(磁盘)、/dev/mmcblk0
(SD 卡)
udev 增强:通过
/etc/udev/rules.d/
规则文件自定义权限、符号链接(如SYMLINK+="usbserial"
)
其他扩展
tracefs(性能追踪,属于 debugfs 子系统):
/sys/kernel/debug/tracing/trace
(查看追踪日志)文件系统专属:
/sys/fs/ext4
(ext4 文件系统挂载参数)进程快捷方式:
/proc/self
(当前进程的符号链接,指向/proc/[pid]
)
核心逻辑总结:
- /proc:偏向 “信息查询”,灵活暴露进程 / 内核状态,API 简单但层次松散。
- /sys:基于 “内核对象模型”,严格层次化管理设备 / 驱动属性,与 udev 联动实现
/dev
自动创建。 - debugfs:专为 “调试” 设计,接口简单,不保证稳定性,适合开发阶段临时暴露信息。
- configfs:聚焦 “动态配置”,允许用户空间实时调整内核对象(如虚拟设备),复杂度较高。
- /dev:本质是 “设备访问入口”,依赖 udev/mdev 与内核驱动协同,实现设备的 “即插即用”。
节点关联关系
以下是 Linux 内核各类节点的路径、归属、创建逻辑及关联关系 的系统整理,覆盖设备树(DTS)、设备文件(/dev)、类(class)等核心关联:
一、按文件系统分类:节点路径全景
1. /proc 文件系统(进程 & 系统状态)
- 挂载点:
/proc
- 典型路径:
路径示例 用途 创建方式 /proc/1234/stat
进程 PID=1234 的状态信息 内核自动生成(进程相关) /proc/misc
杂项设备列表 驱动通过 misc_register()
注册/proc/devices
已注册的设备号(主设备号) 内核自动维护 /proc/sys/net/core/somaxconn
网络队列长度参数 proc_create()
注册/proc/cpuinfo
CPU 硬件信息 内核自动生成
2. /sys 文件系统(sysfs:内核对象模型)
- 挂载点:
/sys
- 核心层级(自动生成,反映内核设备模型):
路径层级 用途 关联机制 设备拓扑: /sys/devices/
物理设备的层次化拓扑(如 PCI、平台设备) 内核设备模型自动生成 总线驱动: /sys/bus/usb/devices/
USB 设备的总线级信息 总线驱动框架(如 USB 子系统) 设备类: /sys/class/net/eth0/
网络设备的逻辑分类(关联 /dev/eth0
)class_create()
+device_create()
注册,udev 生成/dev
节点设备树(DTS): /sys/firmware/devicetree/base/
设备树节点(兼容属性、寄存器地址等) 内核解析 DTS 后自动生成 内核模块: /sys/module/usbcore/parameters/
模块参数(如 usbcore.autosuspend
)模块通过 module_param()
暴露 - 自定义节点:
- 示例:
/sys/kernel/my_module/val
→ 驱动通过kobject_create_and_add()
+sysfs_create_file()
手动注册。
- 示例:
3. debugfs(调试专用,需手动挂载)
- 挂载点:
/sys/kernel/debug
(需执行mount -t debugfs debugfs /sys/kernel/debug
) - 典型路径:
路径示例 用途 创建方式 /sys/kernel/debug/tracing/
ftrace 性能追踪 内核调试框架自动生成 /sys/kernel/debug/usb/usbmon/
USB 数据包抓包 debugfs_create_file()
注册/sys/kernel/debug/my_driver/reg_dump
驱动寄存器 dump 驱动手动注册
4. configfs(动态配置,需手动挂载)
- 挂载点:
/config
(需执行mount -t configfs configfs /config
) - 典型路径:
路径示例 用途 创建方式 /config/usb_gadget/
动态创建虚拟 USB 设备 用户空间通过 mkdir
/echo
配置/config/netdev/
模拟动态网络设备参数 configfs_register_subsystem()
注册
5. /dev 设备文件系统
- 挂载点:
/dev
- 节点来源:
路径示例 生成方式 关联的 sysfs 路径 /dev/ttyUSB0
udev 自动生成(字符设备) /sys/class/tty/ttyUSB0
/dev/sda
udev 自动生成(块设备) /sys/class/block/sda
/dev/mychar
手动 mknod
创建-(无 sysfs 关联,纯手动) /dev/zero
内核内置虚拟设备 -(内核静态注册)
二、核心关联关系:同一设备的多路径映射
以 USB 串口设备(如 /dev/ttyUSB0
) 为例,展示多文件系统的关联:
物理设备拓扑(sysfs):
/sys/devices/pci0000:00/.../usb1/1-1/1-1:1.0/ttyUSB0/
→ 描述设备在硬件总线中的物理位置(PCI → USB 控制器 → 设备 → 串口功能)。逻辑设备类(sysfs + udev):
/sys/class/tty/ttyUSB0/
→ 驱动通过class_create()
注册“tty”类,device_create()
关联物理设备,udev 据此在/dev
生成/dev/ttyUSB0
。用户访问入口(/dev):
/dev/ttyUSB0
→ 用户通过文件操作(open
/read
/write
)访问设备,内核通过file_operations
映射到驱动逻辑。调试扩展(debugfs,若驱动支持):
/sys/kernel/debug/usb/usbmon/1u
→ 抓取该 USB 设备的数据包(需驱动支持 debugfs 接口)。
三、关键区别总结
文件系统 | 核心定位 | 路径特点 | 创建方式 |
---|---|---|---|
/proc | 进程/系统状态“快照” | 扁平/松散(如 /proc/[pid] ) | 手动 proc_create() 或内核自动生成 |
/sys | 内核对象的“层次化镜像” | 严格树形(关联设备模型) | 内核设备模型自动生成 + 手动 kobject 注册 |
debugfs | 调试专用“工具箱” | 挂载于 /sys/kernel/debug | 手动 debugfs_create_*() 注册 |
configfs | 动态配置“操作台” | 挂载于 /config | 用户空间 mkdir + 内核框架支持 |
/dev | 用户访问设备的“门把手” | 扁平(如 /dev/ttyUSB0 ) | udev 自动生成(关联 sysfs)或手动 mknod |
四、实战建议
- 设备开发:优先通过
sysfs + class + udev
实现/dev
自动创建设备节点。 - 调试阶段:用
debugfs
临时暴露驱动内部状态(如寄存器值、缓冲区数据)。 - 动态配置:复杂场景(如虚拟设备)可基于
configfs
让用户空间动态调整参数。 - 系统状态:读取
/proc
信息(如进程状态、系统参数)时,注意接口稳定性(部分路径可能变动)。
这些机制共同构成了 Linux 内核与用户空间交互的“生态系统”,理解它们的分工和关联,是驱动开发、系统调试的核心基础。