news 2026/5/6 20:24:39

Linux驱动|你确定你真的搞懂字符设备号的管理?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux驱动|你确定你真的搞懂字符设备号的管理?

一、Linux内核字符设备号

每一个字符设备都需要设备号,Linux内核通过字符设备号来区分设备的唯一标识。

设备号:由主设备号(major)+次设备号(minor)组成。

  • 主设备号:关联到具体的驱动程序(如1对应mem5对应tty)。
  • 次设备号:区分同一驱动管理的多个设备。

操作依赖设备号,以下是常用的设备号操作函数(配套使用):

函数功能原型
MKDEV(major, minor)由主 / 次设备号生成dev_tdev_t MKDEV(unsigned int major, unsigned int minor);
MAJOR(dev)dev_t提取主设备号unsigned int MAJOR(dev_t dev);
MINOR(dev)dev_t提取次设备号unsigned int MINOR(dev_t dev);

宏定义位于内核文件

@include/linux/kdev_t.h7#define MINORBITS208#defineMINORMASK((1U<<MINORBITS)-1)910#defineMAJOR(dev)((unsignedint)((dev)>>MINORBITS))11#defineMINOR(dev)((unsignedint)((dev)&MINORMASK))12#defineMKDEV(ma,mi)(((ma)<<MINORBITS)|(mi))

主次设备号内存组成如下:

Linux内核提供的主要注册字符设备函数:register_chrdev()register_chrdev_region()

二、 Linux内核字符设备号管理规则

Linux内核字符设备号管理规则:

  1. 数组**chrdevs[CHRDEV_MAJOR_HASH_SIZE]**维护所有的字符设备主次设备号;
  2. 主设备号值区间[0 512],数组下标与主设备号值关系:小于255的主设备号值等于下标,大于254小于512的主设备号对255取余后的值等于小标(比如主设备号251和506共用同一个下标);
  3. 每一个主设备号(251和506虽然公用同一个数组下标,但是各自对应2^20个次设备号)对应的次设备号区间[0-1048575];
  4. 次设备号可以分块申请,块内次设备号必须连续,各个块之间的次设备号不能重叠,每一块次设备号由结构体struct char_device_struct表示,按照次设备号从小到大顺序,通过链表将各个次设备号块连接起来;

三、实例代码验证

为方便验证代码,彭老师从内核中将字符设备号申请注册的核心代码单独拎出来,去掉一些内核特定函数,

这样我们可以脱离内核进行测试:




四、测试

我们通过一组实例讲解字符设备号的分配:

register_chrdev_region(MKDEV(251,0),3,"cdev1"); /* 1 */ register_chrdev_region(MKDEV(251,3),4,"cdev2"); /* 2 */ register_chrdev_region(MKDEV(506,0),3,"cdev3"); /* 3 */ register_chrdev_region(MKDEV(506,3),4,"cdev4"); /* 4 */ register_chrdev(234,"cdevA"); /* 5 */ register_chrdev(489,"cdevB"); /* 6 */
  1. 申请字符设备:chardev1,主设备号:251,次设备号基值:0、个数3、区间:[0-2];
  2. 申请字符设备:chardev2,主设备号:251,次设备号基值:3、个数4、区间:[3-6];
  3. 申请字符设备:chardev3,主设备号:506,次设备号基值:0、个数3、区间:[0-2];
  4. 申请字符设备:chardev4,主设备号:506,次设备号基值:3、个数4、区间:[3-6];
  5. 申请字符设备:chardevA,主设备号:234,次设备号区间:[0-255];
  6. 申请字符设备:chardevB,主设备号:489,次设备号区间:[0-255];

申请成功之后,节点信息如下:

如果此时我们要再申请字符设备cdev5:

register_chrdev_region(MKDEV(506,4),4,"cdev5");

主设备号:506,次设备号基值:4、个数4、区间:[4-7],

那么就会和字符设备cdev4冲突,从而申请失败。

五、代码获取

完整代码获取,关注添加好友,或者后台回复:charno

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

RK3588 USB转CAN扩展实战:从驱动编译到设备绑定的完整指南

1. RK3588 USB转CAN扩展需求与选型指南 在工业控制、汽车电子等领域&#xff0c;CAN总线因其高可靠性和实时性被广泛应用。RK3588作为一款高性能嵌入式处理器&#xff0c;原生支持2路CAN总线接口&#xff0c;但在实际项目中&#xff08;比如自动化生产线或多节点设备控制&#…

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

CV视觉模型发展全景:从传统CNN到多模态大模型的85个经典架构

CV视觉模型发展全景&#xff1a;从传统CNN到多模态大模型的85个经典架构视觉研究者都有同感&#xff0c;标注数据成本实在太高。为了不在这上面烧钱&#xff0c;各路大神开始用无标注数据、网上爬的图文、多模态数据来预训练&#xff0c;通过对比学习、掩码重建这些套路让模型先…

作者头像 李华
网站建设 2026/4/17 16:50:13

d2dx:让经典暗黑破坏神2在现代PC上焕发新生的终极方案

d2dx&#xff1a;让经典暗黑破坏神2在现代PC上焕发新生的终极方案 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还记…

作者头像 李华
网站建设 2026/4/20 3:00:50

STM32与Qt串口助手软硬件结合测试实验

一、实验目的掌握STM32开发板串口&#xff08;USART1&#xff09;的初始化与配置方法&#xff0c;理解串口通信的基本原理。学会使用FlyMCU工具向STM32开发板烧录程序&#xff0c;掌握开发板下载模式与运行模式的切换方法。实现Qt自制串口助手与STM32开发板的双向通信&#xff…

作者头像 李华
网站建设 2026/4/18 2:26:25

【问题修复】cursor或者vscode使用claude

在终端中输入命令&#xff0c; echo export HTTPS_PROXY"http://127.0.0.1:7892" >> ~/.bashrc #其中7892换成你自己的端口 source ~/.bashrc code . cursor .

作者头像 李华
网站建设 2026/4/17 23:30:38

php方案 传统php应用serverless改造

---一、核心障碍清单 ┌────────────────┬─────────────────────────┬──────────┐ …

作者头像 李华