news 2026/9/2 23:13:37

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/9/1 8:27:27

AI原生应用领域多轮对话的安全性保障措施

AI原生应用多轮对话安全性保障:从理论到实践的系统框架 元数据框架 标题:AI原生应用多轮对话安全性保障:从理论到实践的系统框架 关键词:AI原生应用、多轮对话系统、安全性保障、内容审核、隐私保护、模型鲁棒性、prompt注入防御 摘要:AI原生应用(如ChatGPT、Claude)的…

作者头像 李华
网站建设 2026/9/2 11:04:53

1230 算法

import java.util.HashMap; import java.util.Map; import java.util.Scanner;class Solution {public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 读取输入&#xff1a;N&#xff08;点位数量&#xff09;、基地X0、Y0int N scanner.next…

作者头像 李华
网站建设 2026/9/2 3:58:45

【课程设计/毕业设计】基于SpringBoot的房屋租赁系统的设计与实现房屋搜索、租用房屋、出租房屋【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/9/2 9:32:27

Java计算机毕设之基于SpringBoot的房屋租赁系统的设计与实现基于SpringBoot+Vue房屋租赁系统的设计和实现(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/9/2 19:42:49

开发API接口方便高级用户自动化调用资源

开发API接口方便高级用户自动化调用资源 在AI研发日益工程化的今天&#xff0c;一个常见的痛点浮出水面&#xff1a;研究人员和工程师频繁面临“环境不一致”、“任务无法复现”、“资源申请流程繁琐”等问题。手动操作不仅效率低下&#xff0c;还容易引入人为错误。更糟糕的是…

作者头像 李华
网站建设 2026/9/2 11:16:25

Miniconda-Python3.10镜像内置Jupyter,开箱即用的AI实验环境

Miniconda-Python3.10镜像内置Jupyter&#xff0c;开箱即用的AI实验环境 在高校实验室、企业算法团队或云平台项目中&#xff0c;你是否经历过这样的场景&#xff1a;新成员入职第一天&#xff0c;花了整整两天才把Python环境配好&#xff1b;科研论文复现时&#xff0c;代码在…

作者头像 李华