四、procfs:进程与内核的"老牌接口"
procfs 是 Linux 最早的虚拟文件系统(早于 sysfs/debugfs),挂载在 /proc。它的特点是:
- 路径固定、用户习惯已养成(
/proc/meminfo、/proc/cpuinfo 等) - 新代码已经很少直接用 procfs,但旧模块中大量存在
- 推荐使用
seq_file 接口,避免 read 多次调用的坑
4.1 procfs 文件分类
图 7:procfs 文件分类与内核导出机制
四类节点一目了然:
- 进程专属(/proc/[pid]/):每个进程都有,
cmdline、status、maps 等 - 内核全局(/proc/*):跨进程信息,
meminfo、loadavg、uptime - 系统调优(/proc/sys/)
- 设备/驱动(/proc/bus, /proc/irq)
4.2 实战代码示例
/* 使用 proc_create_single(推荐,4.x 内核) */staticintmy_proc_show(structseq_file *m, void *v){seq_printf(m, "Hello from kernel! uptime=%lu\n",ktime_get_seconds());return 0;}staticint __init my_proc_init(void){proc_create_single("my_debug", 0444, NULL, my_proc_show);return 0;}fs_initcall(my_proc_init);
注意:现代内核(5.x+)的新代码建议优先用 debugfs。procfs 应该只用于"已存在的标准化路径"——例如你的模块需要提供一个 /proc/driver/foo 接口兼容老用户。
五、configfs:用户空间主动"配置"内核
前面三种都是内核→用户方向的单向数据流。configfs 反其道而行之——用户主动构造对象,内核监听并响应。
5.1 configfs 工作流程
图 8:configfs 用户态构造对象的完整流程
三步走:
mkdir 创建一个 config_item(内核回调 make_item())echo 写入属性(内核回调 set_attribute())rmdir 销毁对象(内核回调 commit_item() / disconnect_item())
configfs vs sysfs:sysfs 是"内核向用户展示自己有什么",configfs 是"用户告诉内核要创建什么"。典型应用场景:USB gadget 框架(让用户配置一个模拟 U 盘)、网络设备模拟器、cgroup 子系统自定义配置。
5.2 实战代码示例
六、relayfs:高带宽事件流跟踪
当调试节点需要传输高速、大容量、连续的事件流时(比如 USB 数据包、网络报文、磁盘 IO),传统 cat + read 方式会成为瓶颈。系统调用、内存拷贝都会让生产者阻塞。relayfs 提供了零拷贝通道:
6.1 relayfs 原理
图 9:relayfs 双缓冲零拷贝原理与传统日志对比
核心机制:
- 典型应用:blktrace(块设备 IO 跟踪)、perf 事件流
6.2 实战代码示例
性能对比:普通 printk 在高速路径上每秒只能输出 1~5 万条;relayfs 可以做到每秒数百万条而不丢数据。所以 任何需要打印大量调试信息的代码路径,都应该考虑用 relayfs。