当前位置: 首页 > news >正文

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]

核心逻辑总结:

  1. /proc:偏向 “信息查询”,灵活暴露进程 / 内核状态,API 简单但层次松散。
  2. /sys:基于 “内核对象模型”,严格层次化管理设备 / 驱动属性,与 udev 联动实现 /dev 自动创建。
  3. debugfs:专为 “调试” 设计,接口简单,不保证稳定性,适合开发阶段临时暴露信息。
  4. configfs:聚焦 “动态配置”,允许用户空间实时调整内核对象(如虚拟设备),复杂度较高。
  5. /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/cpuinfoCPU 硬件信息内核自动生成
2. /sys 文件系统(sysfs:内核对象模型)
  • 挂载点/sys
  • 核心层级(自动生成,反映内核设备模型)
    路径层级用途关联机制
    设备拓扑/sys/devices/物理设备的层次化拓扑(如 PCI、平台设备)内核设备模型自动生成
    总线驱动/sys/bus/usb/devices/USB 设备的总线级信息总线驱动框架(如 USB 子系统)
    设备类/sys/class/net/eth0/网络设备的逻辑分类(关联 /dev/eth0class_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/ttyUSB0udev 自动生成(字符设备)/sys/class/tty/ttyUSB0
    /dev/sdaudev 自动生成(块设备)/sys/class/block/sda
    /dev/mychar手动 mknod 创建-(无 sysfs 关联,纯手动)
    /dev/zero内核内置虚拟设备-(内核静态注册)

二、核心关联关系:同一设备的多路径映射

以 USB 串口设备(如 /dev/ttyUSB0 为例,展示多文件系统的关联:

  1. 物理设备拓扑(sysfs)
    /sys/devices/pci0000:00/.../usb1/1-1/1-1:1.0/ttyUSB0/
    → 描述设备在硬件总线中的物理位置(PCI → USB 控制器 → 设备 → 串口功能)。

  2. 逻辑设备类(sysfs + udev)
    /sys/class/tty/ttyUSB0/
    → 驱动通过 class_create() 注册“tty”类,device_create() 关联物理设备,udev 据此在 /dev 生成 /dev/ttyUSB0

  3. 用户访问入口(/dev)
    /dev/ttyUSB0
    → 用户通过文件操作(open/read/write)访问设备,内核通过 file_operations 映射到驱动逻辑。

  4. 调试扩展(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/ttyUSB0udev 自动生成(关联 sysfs)或手动 mknod

四、实战建议

  1. 设备开发:优先通过 sysfs + class + udev 实现 /dev 自动创建设备节点。
  2. 调试阶段:用 debugfs 临时暴露驱动内部状态(如寄存器值、缓冲区数据)。
  3. 动态配置:复杂场景(如虚拟设备)可基于 configfs 让用户空间动态调整参数。
  4. 系统状态:读取 /proc 信息(如进程状态、系统参数)时,注意接口稳定性(部分路径可能变动)。

这些机制共同构成了 Linux 内核与用户空间交互的“生态系统”,理解它们的分工和关联,是驱动开发、系统调试的核心基础。

http://www.dtcms.com/a/319358.html

相关文章:

  • NFS 服务器
  • 【运维进阶】NFS 服务器
  • 16.Home-懒加载指令优化
  • .NET 10 新增功能系列文章5——C# 14 中的新增功能
  • latex in overleaf快速通关论文排版
  • E频段无线射频链路为5G网络提供高容量回程解决方案 — 第一部分
  • Linux(17)——Linux进程信号(下)
  • 【RabbitMQ面试精讲 Day 14】Federation插件与数据同步
  • 剑指offer第2版——面试题1:赋值运算符函数
  • 《常见高频算法题 Java 解法实战精讲(2):堆栈与递归》
  • 【RabbitMQ面试精讲 Day 15】RabbitMQ故障转移与数据恢复
  • Java快速入门:包(Package)与导包(import)详解
  • PyTorch LSTM文本生成
  • VC6800智能相机:赋能智能制造,开启AI视觉新纪元
  • 一个设备或系统能够同时管理和监控两个摄像头的配
  • 基于Python+Vue+Mysql实现(物联网)智能大棚
  • Linux文件操作与用户管理
  • 【数据结构——并查集】
  • 第一个vue应用
  • python每日一题 贪心算法练习
  • OLMo 2 架构深度解析:开放语言模型的技术革命
  • QML与C++交互的方式
  • 【JavaEE】多线程之Thread类(上)
  • 健永科技工位RFID读卡器实现生产流水线物料跟踪与柔性化升级
  • 深入解析Go设计模式:责任链模式实战
  • Coze Studio 概览(八)--MCP服务管理
  • 【LeetCode】set和map相关算法题 前K个高频单词、随机链表的复制、两个数组的交集、环形链表
  • LeetCode算法日记 - Day 4: 三数之和、四数之和
  • LeetCode每日一题,2025-8-7
  • .NET PDF处理组件IronPDF:如何通过 AI 简化开发人员处理 PDF的方式