news 2026/4/23 10:44:55

【内核驱动基础】主设备号与次设备号

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【内核驱动基础】主设备号与次设备号

目录

一、主次设备号的定义

二、设备号常用宏

三、设备号的分配与释放

3.1 动态分配与释放

3.2 静态分配与释放

参考资料


一、主次设备号的定义

在 Linux 里,/dev/xxx这种设备文件本质上是一个特殊文件(inode),里面最关键的“身份信息”就是一个设备号 dev_t(本质上是一个整型编码,是一个32位的数据类型,高12位为主设备号,低20位为次设备号)

  • 主设备号(major):告诉内核“应该找哪个驱动/哪个字符设备类(或者块设备类)来处理这个打开请求”
  • 次设备号(minor):告诉驱动“同一个驱动下的哪一个具体实例/通道/端口/逻辑设备”

该类型的定义是在include/linux/types.h文件中:

当用户态做:

fd = open("/dev/xxx", O_RDWR);

VFS 在解析到这是字符设备/块设备文件后,会拿到这个 inode 里保存的dev_t,拆出 major/minor,然后去内核里找到对应的cdev(字符设备)或 bdev(块设备),把这次open转交给对应的file_operations

在自己的设备中,我们可以输入:

ls -l /dev/xxx0

来查看设备节点的主次设备号与设备类型

使用下述指令,可以查看系统当前注册的主设备号:

cat /proc/devices

二、设备号常用宏

在include/linux/kdev_t.h包含了一些设备号相关的常见宏:

  • MAJOR(dev_t)/MINOR(dev_t):拆出主/次设备号
  • MKDEV(major, minor):把主/次设备号合成一个dev_t

三、设备号的分配与释放

设备号分配的本质是:向内核申请一个设备号区间(一个 major + 若干连续 minor),并在退出时把这段区间归还。

设备号分配与释放的函数在头文件include/linux/fs.h这里声明了:

  • alloc_chrdev_region()

  • register_chrdev_region()

  • unregister_chrdev_region()

    并且注释里直接标明来源:/* fs/char_dev.c */,还定义了动态 major 的范围常量(CHRDEV_MAJOR_*)。

3.1 动态分配与释放

动态分配:alloc_chrdev_region()/ 释放:unregister_chrdev_region(),函数原型如下(声明位置:include/linux/fs.h

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name); void unregister_chrdev_region(dev_t from, unsigned count);

实现位置(代码:fs/char_dev.c

  • alloc_chrdev_region()传入major==0的语义,要求内核在“动态主设备号范围”内找一个未占用 major,并把baseminor..baseminor+count-1这段 minor 区间登记进去;成功后通过dev返回起始dev_t(即major:baseminor)。
  • unregister_chrdev_region()反向把这段区间从内部表里摘掉并释放(若跨 major,会按段循环处理)。

3.2 静态分配与释放

静态分配:register_chrdev_region()/ 释放:unregister_chrdev_region()

函数原型(声明位置:include/linux/fs.h

int register_chrdev_region(dev_t from,unsigned count,constchar *name); void unregister_chrdev_region(dev_t from,unsigned count);

实现位置(代码:fs/char_dev.c

  • register_chrdev_region()由调用者给出from = MKDEV(major, first_minor),内核只做两件关键事:
    1. 检查该 major/minor 区间是否与已登记区间重叠(冲突则失败);
    2. 将这段区间登记为已占用(必要时同样按 major 分段处理)。
  • 释放仍统一使用unregister_chrdev_region()(同上,按段撤销登记)。

参考资料

  • 野火字符设备驱动
  • Linux设备驱动程序(第三版)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 15:48:06

掌握AI专著撰写技巧,精选工具推荐,轻松完成专业学术著作

撰写学术专著的挑战与 AI 工具的机遇 撰写学术专著不仅考验我们的学术能力,还挑战我们的心理承受能力。与团队合作写论文不同,专著的写作通常是研究者“单打独斗”的过程。从选定主题、构建框架到内容的撰写和反复修改,几乎每个环节都需要自…

作者头像 李华
网站建设 2026/4/18 12:44:39

基于单片机的智能晾衣杆(有完整资料)

资料查找方式: 特纳斯电子(电子校园网):搜索下面编号即可 编号: CP-51-2021-033 设计简介: 本设计是基于单片机的智能晾衣杆,主要实现以下功能: 温度检测功能:温度小…

作者头像 李华
网站建设 2026/4/18 22:03:57

AI专著撰写好帮手:热门工具大揭秘,让专著创作更轻松

创新是学术专著的核心,它也是写作中最重要的门槛。一本优质的专著,不仅仅是将已有的研究成果简单堆积,而是需要提出贯穿整本书的原创思路、理论体系或研究方法。在庞大的学术文献面前,找出未被深入探讨的研究空白并不容易——有时…

作者头像 李华
网站建设 2026/4/17 7:12:40

高原无人机测试:稀薄空气下的飞行控制算法

高原环境的独特挑战与测试必要性 高原环境(如青藏高原)以稀薄空气、低温、强风切变和低氧条件著称,这些因素对无人机飞行控制算法构成极端考验。空气密度仅为海平面的50%-60%,导致升力不足、动力衰减和传感器漂移,直接…

作者头像 李华
网站建设 2026/4/18 18:38:05

百考通AI论文AIGC检测服务:精准识别AI生成痕迹,筑牢学术原创防线

随着人工智能技术深度融入学术研究和写作,全球高校、科研机构及学术期刊对论文的审查标准正发生着根本性变革。AIGC(人工智能生成内容)检测已迅速成为继“查重”之后的又一关键审核环节。您的论文是否包含无法通过人工评审的AI生成痕迹&#…

作者头像 李华
网站建设 2026/4/22 17:11:18

百考通AI期刊论文服务:智能匹配目标,助力科研成果高效发表

在学术研究的道路上,将深邃的思想与严谨的发现转化为一篇符合期刊规范、具备发表潜力的论文,是每位研究者都必须跨越的关键一步。从确定目标期刊、构思框架到整合研究材料、精确表达,每一步都充满挑战。尤其面对不同级别期刊的差异化要求时&a…

作者头像 李华