news 2026/5/14 22:32:16

Linux 字符设备驱动中 “主次设备号的静态 / 动态分配” 实验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 字符设备驱动中 “主次设备号的静态 / 动态分配” 实验

这个实验是Linux 字符设备驱动中 “主次设备号的静态 / 动态分配” 实验,核心是验证 “手动指定设备号” 和 “内核自动分配设备号” 两种方式,步骤如下:

一、环境准备

和之前的信号量实验一致:

  1. 安装对应架构的交叉编译工具链(如aarch64-linux-gnu-)。
  2. 准备开发板对应的Linux 内核源码,记录其路径(后续MakefileKDIR需填写)。

二、代码准备

将实验代码保存为dev_t_test.c(代码与实验一致,仅补全注释):

#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/kdev_t.h> static int major; //静态分配时的主设备号 static int minor; //静态分配时的次设备号 //向模块传递参数(主/次设备号 权限为用户可读) module_param(major,int,S_IRUGO); module_param(minor,int,S_IRUGO); static dev_t dev_num; //存储设备号,主设备和从设备的组合 //驱动入口函数,分配设备号、 static int __init dev_t_init(void) { int ret; //情况1:手动传入了major参数 静态分配设备号 if(major){ dev_num = MKDEV(major,minor); printk("major is %d\n",major); printk("minor is %d\n",minor); //静态分配设备号 /*int register_chrdev_region(dev_t first, unsigned int count, \ char *name); 参数: 1. dev_t first: 起始的设备号,包括主设备号 (MAJOR,默认最大511) 和次设备号 (MINOR)。 2. unsigned count: 需要分配的连续设备号的数量。 3. const char *name: 注册的设备名称,用于用户态与内核交互时的设备识别。 返回值: - 返回 0 表示成功。 - 如果失败,返回一个负的错误码。 */ ret = register_chrdev_region(dev_num,1,"major_minor_name"); if(ret < 0){ printk("register_chrdev_region is error\n"); } printk("register_chrdev_region is ok\n"); } //情况2:未传入major参数 动态分配设备号 else{ //动态分配设备号,起始设备号为0 /* int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) 参数解析: 1. dev_t *dev: - 用于返回分配的设备号(包含主设备号和次设备号)。 - 主设备号通过自动分配的方式确定。 - 次设备号起始值通过 baseminor 指定。 2. unsigned baseminor: - 指定起始的次设备号。 3. unsigned count: - 要分配的连续设备号的数量。 4. const char *name: - 设备的名称,用于用户态和内核的设备识别。 返回值: - 返回 0 表示成功。 - 返回负数表示失败,失败值是一个错误码(通过 PTR_ERR 提供)。 */ ret = alloc_chrdev_region(&dev_num,0,1,"major_minor_name"); if(ret < 0){ printk("alloc_chrdev_region is error\n"); } printk("alloc_chrdev_region is ok\n"); major = MAJOR(dev_num); minor = MINOR(dev_num); printk("major is %d\n",major); printk("minor is %d\n",minor); } return 0; } //驱动出口函数,释放设备号 static void __exit dev_t_exit(void) { unregister_chrdev_region(dev_num,1); printk("guo module exit\n"); } module_init(dev_t_init);//注册入口函数 module_exit(dev_t_exit);//注册出口函数 MODULE_LICENSE("GPL v2");//遵循GPL协议

三、编写 Makefile(编译驱动模块)

创建Makefile文件(注意替换KDIR为你的内核源码路径):

makefile

# 1. 补充:导出ARM64架构(必须) export ARCH=arm64 # 2. 补充:用export导出交叉编译器(必须,子进程才能继承) export CROSS_COMPILE=/home/alientek/rk3568_linux5.10_sdk/buildroot/output/rockchip_atk_dlrk3568/host/bin/aarch64-buildroot-linux-gnu- # 内核源码目录(你的路径保持不变) KERNELDIR := /home/alientek/rk3568_linux5.10_sdk/kernel # 当前目录(你的定义保持不变) CURRENT_PATH := $(shell pwd) # 要编译的模块(你的定义保持不变) obj-m := dev_t_test.o # 目标定义(你的形式保持不变) build: kernel_modules kernel_modules: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules clean: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

四、编译驱动模块

dev_t_test.cMakefile所在目录执行:

make

编译完成后,会生成dev_t_test.ko(驱动模块文件)。

五、部署与测试(开发板上操作)

dev_t_test.ko传到开发板,然后分两种情况测试:

情况 1:静态分配设备号(手动指定 major/minor)

加载模块时直接传入主 / 次设备号(比如major=200,minor=0):

insmod dev_t_test.ko major=200 minor=0

执行dmesg查看输出,会显示:

plaintext

major is 200 minor is 0 register_chrdev_region is ok
情况 2:动态分配设备号(不指定参数)

直接加载模块,内核自动分配设备号: 如果手动分配主设备号20000失败

动态分配了3616

rmmod dev_t_test # 先卸载之前的模块 insmod dev_t_test.ko

执行dmesg查看输出,会显示内核分配的主 / 次设备号(比如):

plaintext

alloc_chrdev_region is ok major is 240 minor is 0

六、收尾

测试完成后,卸载驱动模块:

rmmod dev_t_test

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

【课程设计/毕业设计】基于Spring Boot的社区信息管理系统的设计与实现基于SpringBoot的智慧社区系统设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/14 1:03:44

Jupyter Notebook连接远程Miniconda-Python3.10环境运行PyTorch

Jupyter Notebook连接远程Miniconda-Python3.10环境运行PyTorch 在深度学习项目日益复杂的今天&#xff0c;一个常见的困境是&#xff1a;本地笔记本配置有限&#xff0c;跑不动大模型&#xff1b;而远程服务器虽然性能强劲&#xff0c;却缺乏便捷的交互式开发体验。如何既享受…

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

PyTorch安装教程GPU版:Miniconda-Python3.10镜像一键配置深度学习环境

PyTorch GPU环境一键搭建&#xff1a;MinicondaPython3.10镜像实战指南 在深度学习项目启动阶段&#xff0c;最让人头疼的往往不是模型设计&#xff0c;而是环境配置——“为什么你的代码在我机器上跑不起来&#xff1f;”这个问题几乎困扰过每一位AI开发者。依赖冲突、CUDA版本…

作者头像 李华
网站建设 2026/5/11 21:55:50

西湖大学与蚂蚁集团OmniAgent:AI实现视听融合视频理解

这项由西湖大学陶柯达教授领导、联合蚂蚁集团多位研究员共同完成的突破性研究发表于2025年12月30日的arXiv预印本平台&#xff0c;论文编号为2512.23646。有兴趣深入了解技术细节的读者可以通过该编号查询完整论文。这项研究首次提出了一种全新的AI视频理解方法&#xff0c;让机…

作者头像 李华
网站建设 2026/5/14 9:08:45

【课程设计/毕业设计】基于Java和Spring Boot的二手车交易系统设计与实现基于Spring Boot与MySQL的二手车销售管理系统的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/14 5:16:20

小白也能学会的PyTorch安装教程GPU版|Miniconda-Python3.10上手指南

小白也能学会的PyTorch安装教程GPU版&#xff5c;Miniconda-Python3.10上手指南 在深度学习的世界里&#xff0c;第一步往往不是写模型&#xff0c;而是——环境装不上。 你是不是也经历过这样的场景&#xff1a;跟着教程敲命令&#xff0c;结果 pip install torch 装完一跑…

作者头像 李华