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

驱动开发硬核特训 · Day 13:从 device_create 到 sysfs,设备文件是如何生成的?


🔍

B站相应的视屏教程
📌 内核:博文+视频 - 备树深度解析:理论 + 实践全指南(含 of 函数与 i.MX8MP 实例)
敬请关注,记得标为原始粉丝。


🔧

📌 本文目标:深入理解 device_create() 函数的核心机制,搞清楚字符设备驱动中 /dev/xxx 是如何自动生成的,掌握 classdevicesysfsudev 之间的协作原理。本文面向 Linux 内核驱动开发初学者,全流程分析字符设备注册背后的关键路径,夯实设备模型的理解。


一、背景导入:为何要讲 device_create?

在这里插入图片描述

在我们编写 Linux 字符设备驱动时,经常会使用如下流程注册设备:

alloc_chrdev_region();
cdev_init();
cdev_add();
class_create();
device_create(); // 核心

完成这些步骤后,系统会自动在 /dev/ 下生成对应设备节点,例如 /dev/my_led

但很多初学者会疑惑:

  • 为什么调用 device_create() 就能生成 /dev/xxx
  • 它是怎么和内核设备模型联系上的?
  • 它是否会注册 struct device
  • udev 又是什么关系?

本篇将一口气讲清楚这些问题。


二、设备模型再复习:class 是什么?

Linux 的设备模型中,class 是连接用户空间 /sys/class//dev/ 的关键中介,它代表某一类设备。

常见 class:

类别描述示例路径
tty终端设备/sys/class/tty/ttyS0
input输入设备/sys/class/input/event0
ledsLED 灯控制/sys/class/leds/user_led

你在驱动中调用:

struct class *led_class = class_create(THIS_MODULE, "my_led_class");

内核会在 /sys/class/my_led_class/ 下创建一个新目录,为后续设备挂载做准备。

接下来进入主角——device_create()


三、device_create() 的功能与原型

3.1 函数原型

struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...);

参数说明:

参数含义
class所属的 class(如 my_led_class)
parent父设备,可为 NULL
devt设备号,MKDEV(major, minor)
drvdata设备私有数据,可用 device_get_drvdata 获取
fmt设备名称格式,如 “my_led%d”

3.2 作用

执行 device_create() 会做三件事:

  1. 分配并注册一个新的 struct device
  2. 将其挂入 class,即:/sys/class/xxx/ 下出现新设备目录
  3. 通知 udev 创建 /dev/xxx 节点

这正是用户空间中能自动看到 /dev/my_led0 的原因。


四、完整流程梳理

我们通过一张图总结:

驱动代码
└── device_create()├── 创建设备结构体 struct device├── 添加到 class 的设备列表│   └── 映射到 /sys/class/my_class/my_led0├── 发出 uevent 通知│   └── 用户空间 udev 监听到设备加入事件│       └── 根据规则创建 /dev/my_led0

举个实际路径:

/sys/class/my_led_class/my_led0      # class 目录
/dev/my_led0                         # 实际设备节点(由 udev 创造)

五、实战演练:创建 LED 字符设备

5.1 初始化设备号

dev_t devno;
alloc_chrdev_region(&devno, 0, 1, "my_led");
major = MAJOR(devno);

5.2 初始化 cdev

cdev_init(&my_cdev, &my_fops);
cdev_add(&my_cdev, devno, 1);

5.3 创建设备 class 与 device

my_class = class_create(THIS_MODULE, "my_led_class");
device_create(my_class, NULL, devno, NULL, "my_led0");

此时:

  • /sys/class/my_led_class/my_led0 被创建
  • /dev/my_led0 自动生成(由 udev 监听创建设备事件)

六、udev 的作用与补充说明

udev 是 Linux 中用户空间的设备管理守护进程。

  1. 它监听内核发出的设备事件(uevent
  2. 根据 /etc/udev/rules.d/ 的规则,执行创建设备节点、添加权限等操作

若系统中没有运行 udev(如部分嵌入式系统),需要用 mdev 或手动创建设备文件:

mknod /dev/my_led0 c 240 0

七、常见问题解答 Q&A

Q1:如果不调用 device_create(),是否还能访问设备?

可以,但必须自己创建设备节点:

mknod /dev/my_led0 c 240 0

并确保 major/minor 正确。但 /sys/class/ 等路径就不会自动生成。


Q2:多个设备如何创建多个节点?

你可以多次调用 device_create()

device_create(my_class, NULL, MKDEV(240, 0), NULL, "my_led0");
device_create(my_class, NULL, MKDEV(240, 1), NULL, "my_led1");

这样就会生成 /dev/my_led0/dev/my_led1


Q3:如何自动清理?

在模块卸载时:

device_destroy(my_class, MKDEV(240, 0));
class_destroy(my_class);
unregister_chrdev_region(MKDEV(240, 0), 1);

八、总结归纳

核心步骤功能
class_create创建设备类别,挂载到 /sys/class
device_create注册 struct device,生成 /sys 和 /dev 节点
udev监听内核事件,自动创建设备文件
dev_set_drvdata设置私有数据,可用 device_get_drvdata 获取
cdev 操作管理字符设备的核心操作结构

九、今日练习题(建议动手)

  1. 编写一个字符设备驱动,支持创建两个设备节点 /dev/led0/dev/led1
  2. 分别用 write() 控制两个设备状态,打印开关日志
  3. 使用 udevadm monitor 查看 device_create() 时产生的事件

📌 下一篇预告:

驱动开发硬核特训 · Day 14:深入理解 class、device 与 /dev 的完整链路
将进一步拆解 class.c 源码,讲清 device_add()kobject 关系,帮助你彻底掌握设备文件生成机制。


如果这篇内容帮助到你,欢迎点赞、收藏、转发!
📺 B站:嵌入式Jerry
📘 CSDN 博客:嵌入式Jerry

👉 下一篇,见!

相关文章:

  • OpenCV 图形API(38)图像滤波-----Sobel 算子操作函数Sobel()
  • OpenCv高阶(五)——SIFT特征提取
  • git的上传流程
  • C 语言中的 volatile 关键字
  • 线束线缆从二维设计到虚拟验证全流程解决方案
  • 5、Props:组件间的密语——React 19 数据传递全解
  • 从入门到精通:Helm Charts 创建初学者指南
  • vue3的teleport和suspense是什么
  • 自学Matlab-Simscape(初级)- 2.3 Simscape Multibody 模块之Belts and Cables(皮带与线缆)
  • 京东商品详情API接口请求方式及数据文档说明
  • 无人机避障与目标识别技术分析!
  • 深入解析布尔注入:原理、实战与防御
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——PCIE2.0 x1接口测试
  • 计算机网络 - TCP协议
  • Node.js 数据库 事务 项目示例
  • 高版本Android (AIDL HAL) 使用HIDL方法
  • vue3 uniapp vite 配置之定义指令
  • 《vue3学习手记3》
  • 【UE5】连接射频线案例教程
  • 数据结构与算法[零基础]---4.树和二叉树
  • gbk网站模板/东莞优化网站制作
  • 做3dmax展示的网站/aso优化教程
  • 网站 建设初步/济南百度竞价代运营
  • 常熟做网站多少钱按/长尾词优化外包
  • 安徽股票配资网站建设/知道百度
  • 实验教学网站的建设研究/苏州旺道seo