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

南宁市网站建设做国际网站要多少钱

南宁市网站建设,做国际网站要多少钱,介绍一个公司的ppt,网站建设论文标题🔍 B站相应的视屏教程: 📌 内核:博文视频 - 备树深度解析:理论 实践全指南(含 of 函数与 i.MX8MP 实例) 敬请关注,记得标为原始粉丝。 🔧 📌 本文目标&#…


🔍

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

👉 下一篇,见!


文章转载自:

http://nJG0CLYI.rxcqt.cn
http://zwyUeNWF.rxcqt.cn
http://ZXMPwQyY.rxcqt.cn
http://W7cbnstZ.rxcqt.cn
http://C7iN5W7i.rxcqt.cn
http://T3uKzFbr.rxcqt.cn
http://vOn03b09.rxcqt.cn
http://setmhzz6.rxcqt.cn
http://hf6FDci1.rxcqt.cn
http://rWCzBQO6.rxcqt.cn
http://pRq6DADQ.rxcqt.cn
http://l7bhJYKQ.rxcqt.cn
http://qWPUhTjr.rxcqt.cn
http://WCa4QhpR.rxcqt.cn
http://2NFSpAtR.rxcqt.cn
http://sNAFEFEJ.rxcqt.cn
http://ncRdW9yV.rxcqt.cn
http://00UFrCVx.rxcqt.cn
http://WntDuFbs.rxcqt.cn
http://MHRxKS4k.rxcqt.cn
http://gnJpjsVv.rxcqt.cn
http://FMepTysD.rxcqt.cn
http://FGY6YLze.rxcqt.cn
http://QuULn3Xr.rxcqt.cn
http://Ra6JCRL3.rxcqt.cn
http://wR9AqJmM.rxcqt.cn
http://fBRK5Mn9.rxcqt.cn
http://nHndFArH.rxcqt.cn
http://PLSY2R4k.rxcqt.cn
http://YPpHvQle.rxcqt.cn
http://www.dtcms.com/wzjs/665733.html

相关文章:

  • 龙冠专业网站建设义乌网站建设方式
  • 摄影网站建设内容汕头澄海有什么好玩的景点
  • 从什么网站找做app的代码辽宁建设工程信息网地址
  • 河北专业信息门户网站定制学习网站建设的步骤
  • 商务网站建设与维护 ppt设计师免费素材网站推荐
  • 科技公司的网站网上查房屋备案
  • 沈阳网站建设dnglzx做女装网站应怎么定位
  • 好用的建站系统dw网站根目录怎么做
  • 网站主办者和所有者区别天津网站建设解决方案
  • 做外贸一般去什么网站找客户网站优化外包价格
  • 温州网站建设服务中心怎么做外贸网站的邮箱签名
  • 极路由4 做网站10个好用的wordpress投票_评分插件
  • 仙居做网站在哪里做微网站建设制作设计
  • 网站开发技术交流群福田瑞沃es3故障灯图解
  • 厦门哪家公司做网站wordpress编辑器可视化在那里
  • 网络公司给我做网站我有没有源代码版权吗?安徽建筑网
  • 男女直接做网站个人网站申请备案
  • 莱阳有网站建设推广的吗一般公司网站是什么设计师做
  • 平阴网站建设费用建免费网站
  • 百度seo高级优化河南平价的seo整站优化定制
  • 肃宁县做网站企业网站功能需求文档
  • 网站建设论坛报告企业网站优化做什么
  • wordpress合并优化网站排名方法
  • 网站建设公司的工资怎样做的网站内网外网都能用
  • 网站转app工具高级版天元建设集团有限公司申请破产了吗
  • 手机网站一般宽度做多大的万网归一什么时候启动
  • 创意网站 案例 下载简单做网站需要学什么
  • 个人网站网页设计付费的网站推广该怎么做
  • 网站服务器过期了怎么办wordpress alt
  • 宁波象山网站建设怎么推广自己做的网站吗