news 2026/5/9 12:04:16

Linux驱动-类与设备节点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux驱动-类与设备节点

类与设备节点

设备节点是什么?

如果把驱动.ko认为是普通应用程序,那么设备节点/dev/xxx就是该应用程序的启动链接。

  • 内核中单有驱动.ko,没有启动链接,无法启动,该驱动程序无用。
  • 单有/dev/xxx,没有驱动的话,你cat /dev/xxx,系统报错cat: /dev/test: 没有那个设备或地址,cat其实会调用open这样的函数。

在比较原始驱动中的,如果没有udev/mdev机制(即没有自动创建设备节点)。insmod xxx.ko后你可以在/proc/devices中看到主设备号,和对应驱动名称,但无法在/dev/xxx看到对应设备。

如何创建和删除设备节点与类

手动创建
mknod/dev/led c2500

其中dev/led 为设备节点 ,c 代表字符设备, 250代表主设备号, 0代表次设备号。
主设备号:可以从/proc/devices查询到,你要使用的设备的主设备号。
次设备号:标识具体的设备实例

手动删除rm -f /dev/xxx

使用udev/mdev自动创建
  1. 创建设备类struct class *class_create (struct module *owner, const char *name)
    1. 参数 owner 一般为 THIS_MODULE
    2. 参数 name 是类名字。
    3. 返回值是个指向结构体 class 的指针,也就是创建的类。
  2. 创建设备节点
structdevice*device_create(structclass*class,structdevice*parent,dev_tdevt,void*drvdata,constchar*fmt,...)
  • class:设备要创建到哪个类下面
  • parnet:父设备一般为,NULL
  • devt:设备号
  • drvdata:设备可能会用到的一些数据
  • *fmt, ...:
    • fmt: 格式化控制字符串(比如"mydev%d")。
    • ...: 填充格式化字符串的具体变量。
    • 假设你有一个驱动程序管理着 4 个相同的硬件端口,你想在/dev/下生成mydev0mydev3。你可以这样写:
for(inti=0;i<4;i++){device_create(my_class,NULL,MKDEV(major,i),NULL,"mydev%d",i);}
  1. 记得moudel_exit()时,记得销毁设备节点和设备类。void class_destroy(struct class *cls);void device_destroy(struct class *class, dev_t devt)

类与设备节点的关系

没有class,手动创建的设备节点也可以用。udev机制在创建设备节点前,必须要有类。目前不清楚为什么这样。类应该是有关键作用,只是目前我尚不清楚。现代系统推荐采用udev机制。

驱动程序.ko与设备节点的关系

用户程序||open("/dev/chrdevbase")|/dev/chrdevbase(200:0)||查主设备号|chrdevbase.ko||file_operations|chrdevbase_open/read/write

模块名,驱动名,类名,设备节点名

这四个名字完全不一样

1. 模块名 (Module Name)
  • 对应你代码:编译生成的文件名(如chrdevbase.ko)。
  • 在哪里看:lsmod命令。
  • 用途:管理.ko文件的加载和卸载。当你执行rmmod xxx时,内核找的就是这个名字。
  • 关联:通常由 Makefile 中的obj-m := chrdevbase.o决定,一般会等于文件名。
2. 驱动名 (Driver Name)
  • 对应你代码:register_chrdev(major, "mychrdriver", &fops)中的第二个参数。
  • 在哪里看:cat /proc/devices
  • 用途:内核内部登记。它是给内核看的,用来标识这个主设备号被哪个驱动占用了。它不直接影响/dev下的文件名。
3. 类名 (Class Name)
  • 对应你代码:class_create(THIS_MODULE, "mychrclass")中的第二个参数。
  • 在哪里看:/sys/class/目录。
  • 用途:逻辑分类。它把具有相同功能的设备(如所有的 LED、所有的串口)归为一类。在/sys/class/mychrclass/下,你可以找到属于这个类的所有设备。
4. 设备节点名 (Device Node Name)
  • 对应你代码:device_create(..., "mychrdevices")中的最后一个参数。
  • 在哪里看:/dev/目录。
  • 用途:用户空间的“入口”。这是应用层open("/dev/mychrdevices", ...)时真正使用的字符串。
  • 关联:这是类(Class)和udev合作生成的成果。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 3:30:45

Git blame追踪PyTorch代码行修改历史

Git blame 追踪 PyTorch 代码行修改历史 在深度学习项目中&#xff0c;我们常常会遇到这样的场景&#xff1a;某个 CUDA 内存释放行为突然变了&#xff0c;模型训练开始频繁 OOM&#xff08;内存溢出&#xff09;&#xff0c;但环境没动、代码也没改。这时候你翻遍文档和 GitH…

作者头像 李华
网站建设 2026/5/5 4:10:29

React—— Next.js 配置 API 代理解决跨域问题

什么是跨域? 当你的前端页面(比如 http://localhost:3000)请求另一个域名的接口(比如 http://api.example.com),浏览器会阻止这个请求,这就是跨域问题。 前端页面: http://localhost:3000 API接口: http://api.example.com:8080↑ 域名/端口不同,浏览器拒绝请求解决…

作者头像 李华
网站建设 2026/5/4 8:05:27

一位淘宝工程同学的大模型LoRA微调尝试

本文主要介绍了大模型时代下&#xff0c;如何通过 LoRA&#xff08;Low-Rank Adaptation&#xff09;这一参数高效微调技术&#xff0c;实现对大模型的轻量级定制。文章从微调的基本概念出发&#xff0c;详细阐述了 LoRA 的原理、优势与局限性&#xff0c;并结合本地原生实现&a…

作者头像 李华
网站建设 2026/5/1 12:55:47

小白程序员逆袭:一文搞懂大模型智能体框架,开发效率提升10倍!

从编写一次性的脚本到使用一个成熟的框架&#xff0c;是软件工程领域一次重要的思维跃迁。本文探讨如何利用业界主流的一些智能体框架&#xff0c;来高效、规范地构建可靠的智能体应用。我们将概览当前市面上主流的智能体框架&#xff0c;然后并对几个具有代表性的框架&#xf…

作者头像 李华
网站建设 2026/5/9 10:58:12

在企业级应用开发中实现精细化权限控制的策略与实践

权限控制作为企业级应用安全体系的核心组成部分&#xff0c;其设计直接关系到系统的安全性与数据的完整性。本文旨在探讨基于 Spring Security 框架&#xff0c;如何通过动态参数实现细粒度权限校验&#xff0c;以超越传统基于静态角色的粗放式权限管理。 背景与挑战 传统权限…

作者头像 李华
网站建设 2026/4/28 12:46:13

sward快速上手指南 - 安装与配置

推荐一款国产开源免费的知识管理工具 - sward&#xff0c;sward包含知识库管理、文档管理、文档协作、文档分享等模块&#xff0c;支持普通文档、markdown等格式&#xff0c;产品简洁易用、开源免费&#xff0c;本文将介绍如何快速安装配置sward。 1、安装 sward支持多系统安…

作者头像 李华