【Linux】【驱动】注册字符设备号

news2025/4/20 7:44:48

【Linux】【驱动】注册字符设备号

  • 1. 绪论
    • 1 、静态分配设备号
    • 2、动态分配设备号
    • 3、注销设备号
  • 2 实现的代码
  • 3 加载驱动程序

1. 绪论

在之前杂项设备的时候,设备号是固定的,字符设备就需要自己去申请设备号了,
申请设备号有两个方式,静态和动态两种

一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备
号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各个设备。Linux 提供了一个名为
dev_t 的数据类型表示设备号,dev_t 定义在文件 include/linux/types.h 里面,
dev_t 是个 32 位的变量,其中 12 位用来表示主设备号,20 位用来表示次设备号。

#define MINORBITS20 //次设备号的位数,一共是 20 位
#define MINORMASK ((1U << MINORBITS) - 1) //次设备号的掩码
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) //在 dev_t 里面获取我们的主设备号
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) //在 dev_t 里面获取我们的次设备号
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) //将我们的主设备号和次设备号组成一个 dev_t 类型。

1 、静态分配设备号

如下操作可以查看设备号…操作未实现待查看

cat /proc/devices

设备号的静态申请函数

int register_chrdev_region(dev_t *dev, unsigned count,const char *name);

dev 设备号的起始值。类型是 dev_t 类型
count 要申请的次设备号的个数
name 设备名字
返回值 成功返回 0,失败返回负数

2、动态分配设备号

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

dev 保存申请到的设备号
baseminor 次设备号起始地址,alloc_chrdev_region 可以申请一段连续的多个设备号,这些设
备号的主设备号一样,但是次设备号不同,次设备号以 baseminor 为起始地址地址
开始递增。一般 baseminor 为 0,也就是说次设备号从 0 开始。

count 要申请的设备号数量
name 设备名字
返回值 成功返回 0,失败返回负数。使用动态分配会优先使用 255 到 234

3、注销设备号

void unregister_chrdev_region(dev_t from, unsigned count)

from 要释放的设备号
count 表示从 from 开始,要释放的设备号数量

2 实现的代码

通过两个方式实现了两个申请设备号的方法,

#include <linux/init.h>
#include <linux/module.h>     //最基本的文件,支持动态添加和卸载模块。
#include <linux/fs.h>        //包含了文件操作相关 struct 的定义,例如大名鼎鼎的 struct file_operations
#include <linux/kdev_t.h>


#define DEVICE_NUMBER 1 		//定义次设备号的个数
#define DEVICE_SNAME "schrdev"  //定义静态注册设备的名称
#define DEVICE_ANAME "achrdev"  //定义动态注册设备的名称
#define DEVICE_MINOR_NUMBER 0 	//定义次设备号的起始地址


static int major_num,minor_num; //定义主设备号和次设备号
module_param(major_num,int,S_IRUSR); //驱动模块传入普通参数 major_num
module_param(minor_num ,int,S_IRUSR);//驱动模块传入普通参数 minor_num




//drivers for init
static int hello_init(void)
{
	dev_t dev_num;
	int ret;//函数返回值
	if(major_num)
	{
		/*静态注册设备号*/
		printk("major_num = %d\n",major_num);//打印传入进来的主设备号
		printk("minor_num = %d\n",minor_num);//打印传入进来的次设备号
		dev_num = MKDEV(major_num,minor_num);//MKDEV 将主设备号和次设备号合并为一个设备号
		ret = register_chrdev_region(dev_num, DEVICE_NUMBER,DEVICE_SNAME);//注册设备号
		if(ret<0)
		{
			printk("register_chrdev_region error\n");
		}
		//静态注册设备号成功,则打印。
		printk("register_chrdev_region ok\n");
	}
	else
	{
		/*动态注册设备号*/
		ret = alloc_chrdev_region(&dev_num,DEVICE_MINOR_NUMBER,1, DEVICE_ANAME);
		if(ret<0)
		{
			printk("alloc_chrdev_region error\n");
		}
		//动态注册设备号成功,则打印
		printk("alloc_chrdev_region ok\n");
		major_num =MAJOR(dev_num); //将主设备号取出来
		minor_num = MINOR(dev_num);//将次设备号取出来
		printk("major_num = %d\n",major_num);//打印传入进来的主设备号
		printk("minor_num = %d\n",minor_num);//打印传入进来的次设备号
	}
	return 0;
}


//drivers for exit 
static void hello_exit(void)
{
	unregister_chrdev_region(MKDEV(major_num,minor_num),DEVICE_NUMBER);//注销设备号
	printk("gooodbye  \n");

}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");

3 加载驱动程序

移动文件

cp chrdev.ko /home/book/nfs_rootfs/

删除文件

rm -f + chrdev.ko

打开printk

echo "7 4 1 7"> /proc/sys/kernel/printk

挂载动态分配的设备号

insmod chrdev.ko

挂载静态分配的设备号

insmod chrdev.ko major_num=9

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/937534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年Android应用开发的6大框架

2024年Android应用开发的6大Framwork 2024年Android应用开发的6大框架&#xff0c;影响移动应用开发领域&#xff0c;改变应用的创建和用户使用方式。随着移动应用市场不断发展&#xff0c;对灵活和高效框架的需求也在增加。这些框架为开发人员提供资源和工具&#xff0c;构建…

手写RPC框架--1.介绍与网络传输

介绍与网络传输 0.介绍a.什么是rpcb.rpc的通信流程 1.网络传输a.零拷贝1) 零拷贝的概念2) Netty的零拷贝 b.IO多路复用c.Netty入门1) netty中的helloworld d.封装报文1) 协议结构2) 模拟封装报文 e.序列化f.压缩和解压缩 0.介绍 a.什么是rpc rpc 的全称是 Remote Procedure C…

S905L3A(M401A)拆解, 运行EmuELEC和Armbian

关于S905L3A / S905L3AB S905Lx系列没有公开资料, 猜测是Amlogic用于2B的芯片型号, 最早的 S905LB 是 S905X 的马甲, 而这个 S905L3A/S905L3AB 则是 S905X2 的马甲, 因为在性能评测里这两个U的得分几乎一样. S905L3A/S905L3AB 和 S905X2, S905X3 一样 GPU 是 G31, 相比前一代的…

【Linux】深入理解文件操作

文章目录 初次谈论文件重温C语言文件操作系统文件操作接口openwriteread 再次谈论文件文件描述符文件描述符的分配规则 重定向什么是重定向重定向的本质系统调用接口实现重定向<、>、>> 初次谈论文件 开始之前先谈论一下关于文件的一些共识性问题。 一个文件可以…

(笔记一)利用open_cv在图像上进行点标记,文字注记,画圆、多边形、椭圆

&#xff08;1&#xff09;CV2中的绘图函数&#xff1a; cv2.line() 绘制线条cv2.circle() 绘制圆cv2.rectangle() 绘制矩形cv2.ellipse() 绘制椭圆cv2.putText() 添加注记 &#xff08;2&#xff09;注释 img表示需要绘制的图像color表示线条的颜色&#xff0c;采用颜色矩阵…

联想电脑装系统无法按F9后无法从系统盘启动的解决方案

开机时按F9发现没有加载系统盘. 打开BIOS设置界面&#xff0c;调整设置如下: BOOT MODE: Legacy Support.允许legacy方式boot. BOOT PRIORITY: Legacy First. Legacy方式作为首选的boot方式. USB BOOT: ENABLED. 允许以usb方式boot. Legacy: 这里设置legacy boot的优先级,…

保姆级教程:从0到1使用Stable Diffusion XL训练LoRA模型 |【人人都是算法专家】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中对业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 Rocky在知乎上持续撰写Stable Diffusion XL全方位的解析文章…

HTML之VSCode简单配置与创建

目录 插件下载 然后输入源码&#xff1a; 使用 效果 插件下载 下载这个插件后可以直接运行&#xff1a; 然后创建一个文件&#xff1a; 然后输入源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

渗透测试工具ZAP入门教程(1)-安装和快速开始

介绍 ZAP Zed Attack Proxy&#xff08;ZAP&#xff09;是一个免费的开源渗透测试工具&#xff0c;在 软件安全项目 &#xff08;SSP&#xff09;。ZAP 专为测试 Web 应用程序而设计&#xff0c;既灵活又可扩展。 ZAP的核心是所谓的“中间人代理”。它位于测试人员的浏览器和…

【算法训练-双指针】最长无重复子串(数组)

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是最长无重复子串或最长无重复子数组&#xff0c;这类题目出现频率还是很高的。 最长无重复子数组 先来看看数组数据结构的题目 题干 输入&#…

Shiro认证框架

目录 概述 认证授权及鉴权 Shiro框架的核心组件 基本流程 spring bootshiromybatisPlus...实现用户登录 step1:准备工作 (1)坐标 (2)连接数据库 (3)JavaBean (4)dao数据访问层 (5)密码工具类 DigestsUtil (6)配置类 step2&#xff1a;认证功能 step3:授权鉴权 概述…

11. 网络模型保存与读取

11.1 网络模型保存(方式一) import torchvision import torch vgg16 torchvision.models.vgg16(pretrainedFalse) torch.save(vgg16,"./model/vgg16_method1.pth") # 保存方式一&#xff1a;模型结构 模型参数 print(vgg16) 结果&#xff1a; VGG((feature…

飞腾FT-2000/4、D2000 log报错指导(2)

在爱好者群中遇见了很多的固件问题,这里总结记录了大家的交流内容和调试心得。主要是飞腾桌面CPU FT-2000/4 D2000相关的,包含uboot和UEFI。希望对大家调试有所帮助。 这个专题会持续更新,凑够一些就发。 12 UEFI现象:主板启动时串口信息停在 s3 flag form ec 处,如下图所…

局域网中电脑共享文件给手机

学习资源&#xff1a; 局域网共享&#xff1a;这样设置&#xff0c;你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果&#xff1f; 连接同一个WIFI&#xff0c;电脑端为服务端&#xff0c;提供共享文件&#xff0c;手机是客户端&#xff0c;可以读取服务端…

Java-泛型

文章目录 Java泛型什么是泛型&#xff1f;在哪里使用泛型&#xff1f;设计出泛型的好处是什么&#xff1f;动手设计一个泛型泛型的限定符泛型擦除泛型的通配符 结论 Java泛型 什么是泛型&#xff1f; Java泛型是一种编程技术&#xff0c;它允许在编译期间指定使用的数据类型。…

Leetcode:238. 除自身以外数组的乘积【题解超详细】

纯C语言实现&#xff08;小白也能看明白&#xff09; 题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数…

8. 损失函数与反向传播

8.1 损失函数 ① Loss损失函数一方面计算实际输出和目标之间的差距。 ② Loss损失函数另一方面为我们更新输出提供一定的依据。 8.2 L1loss损失函数 ① L1loss数学公式如下图所示&#xff0c;例子如下下图所示。 import torch from torch.nn import L1Loss inputs torch.tens…

冷启问题目前常见解决方案

1、冷启动的基本方式 随机冷启 个性化冷启 2、冷启动解决问题 冷启动保量 冷启动保量&#xff0c;保证每个item曝光的次数一样&#xff0c;实时统计已曝光的次数和要曝光的次数 冷启动结束过滤&#xff0c;如果需曝光的量越大&#xff0c;且越接近冷启结束时间&#xff0…

3.2 数据的表现形式及其运算

3.2.1 常量和变量 在计算机高级语言中&#xff0c;数据有两种表现形式&#xff1a;常量和变量。 1.常量 在程序运行过程中&#xff0c;其值不能被改变的量称为常量。如例3.1程序中的5,9,32和例3.2程序中的1000,0.0036,0.0225,0.0198是常量。数值常量就是数学中的常数。 常用的…

三、前端监控之Sentry的介绍

Sentry介绍 Sentry是一个开源的实时事件日志记录和聚合平台。它专门用于监视错误和提取执行适当的事后操作所需的所有信息, 而无需使用标准用户反馈循环的任何麻烦。支持 web 前后端、移动应用以及游戏&#xff0c;支持 Python、OC、Java、Go、Node、Django、RoR 等主流编程语…