当前位置: 首页 > news >正文

ARM驱动学习之8 动态申请字符类设备号

                            ARM驱动学习之8 动态申请字符类设备号

KernelCode:
• 字符设备函数在文件“include/linux/fs.h”中
• alloc_chrdev_region() 是动态分配主次设备号。
• 宏定义MAJOR提取dev_t数据中的主设备号源码:
/*** alloc_chrdev_region() - register a range of char device numbers* @dev: output parameter for first assigned number* @baseminor: first of the requested range of minor numbers * @count: the number of minor numbers required* @name: the name of the associated device or driver** Allocates a range of char device numbers.  The major number will be* chosen dynamically, and returned (along with the first minor number)* in @dev.  Returns zero or a negative error code.*/int alloc_chrdev_region(dev_t *dev,unsigned baseminor, unsigned count,const char *name)
{struct char_device_struct *cd;cd = __register_chrdev_region(0, baseminor, count, name);if (IS_ERR(cd))return PTR_ERR(cd);*dev = MKDEV(cd->major, cd->baseminor);return 0;
}/*** unregister_chrdev_region() - return a range of device numbers* @from: the first in the range of numbers to unregister* @count: the number of device numbers to unregister** This function will unregister a range of @count device numbers,* starting with @from.  The caller should normally be the one who* allocated those numbers in the first place...*/
void unregister_chrdev_region(dev_t from, unsigned count)
{dev_t to = from + count;dev_t n, next;for (n = from; n < to; n = next) {next = MKDEV(MAJOR(n)+1, 0);if (next > to)next = to;kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));}
}1.在scdev_init如下:
DEVICE_NAME改为“ascdev”
ret = alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME);
numdev_magor = MAJOR(num_dev);
printk(KERN_EMERGE "numdev_magor is %d \n",numdev_magor);• 加载运行
– 使用命令“cat /proc/devices”查看
– 动态加载模块之后再查看设备号

源码:

#include <linux/init.h>
/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include <linux/module.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*//*定义module_param module_param_array的头文件*/
#include <linux/moduleparam.h>
/*定义module_param module_param_array中perm的头文件*/
#include <linux/stat.h>/*字符设备函数*/
#include <linux/fs.h>
/*MDKDEV转换设备号数据类型宏定义*/
#include <linux/kdev_t.h>
/*定义字符设备的结构体*/
#include <linux/cdev.h>#define DEVICE_NAME "Ascdev"
#define DEVICE_MINOR_NUM 2
#define DEV_MAJOR 0
#define DEV_MINOR 0MODULE_LICENSE("Dual BSD/GPL");
/*声明是开源的,没有内核版本限制*/
MODULE_AUTHOR("iTOPEET_dz");
/*声明作者*/static int numdev_major = DEV_MAJOR ;//主设备号
static int numdev_minor = DEV_MINOR ;//次设备号module_param(numdev_major,int,S_IRUSR);
module_param(numdev_minor,int,S_IRUSR);static int Ascdev_init(void)
{int ret = 0;dev_t num_dev;if(numdev_major){num_dev = MKDEV(numdev_major,numdev_minor);//宏命令,用于处理各种设备号相关的数据//设备注册ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME);if(ret < 0){printk(KERN_EMERG "register_chrdev_region req is %d is failed \n",num_dev );return -1;}printk(KERN_EMERG "register_chrdev_region %d is success \n",numdev_major);	}else{ret = alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME);if(ret < 0){printk(KERN_EMERG "alloc_chrdev_region req is %d is failed \n",num_dev );return -1;}numdev_major = MAJOR(num_dev);printk(KERN_EMERG "numdev_major is %d \n",numdev_major);}printk(KERN_EMERG "Ascdev enter!\n");/*打印信息,KERN_EMERG表示紧急信息*/return 0;
}static void Ascdev_exit(void)
{	unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM);printk(KERN_EMERG "Ascdev exit!\n");
}module_init(Ascdev_init);
/*初始化函数*/
module_exit(Ascdev_exit);
/*卸载函数*/

Makefile:

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
#obj-m += mini_linux_module.o 
obj-m += request_cdev_num.o 
#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/Android4.0/iTop4412_Kernel_3.0
#当前目录变量
PWD ?= $(shell pwd)#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:make -C $(KDIR) M=$(PWD) modules#make clean执行的操作是删除后缀为o的文件
clean:rm -rf *.mod.c *.o *.order *.ko *.mod.o *.symvers

相关文章:

ARM驱动学习之8 动态申请字符类设备号

ARM驱动学习之8 动态申请字符类设备号 KernelCode: • 字符设备函数在文件“include/linux/fs.h”中 • alloc_chrdev_region() 是动态分配主次设备号。 • 宏定义MAJOR提取dev_t数据中的主设备号源码&#xff1a; /*** alloc_chrdev_region() - register a range of char dev…...

TCP.IP四层模型

一、TCP/IP模型协议分层 1、应用层&#xff1a; 2、传输层&#xff1a; TCP&#xff1a;传输控制协议 UDP&#xff1a;用户数据报协议 3、网络层&#xff1a; IP: 国际协议&#xff08;IP地址&#xff09; ICMP&#xff1a; 互联网控制消息协议&#xff08;互联网…...

极狐GitLab DevSecOps 功能合集(七大安全功能)

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

进阶SpringBoot之异步任务、邮件任务和定时执行任务

SpringBooot 创建 Web 项目 异步任务&#xff1a; service 包下创建 AsyncService 类 Async 异步方法 Thread.sleep(3000) 停止三秒&#xff0c;捕获异常 package com.demo.task.service;import org.springframework.scheduling.annotation.Async; import org.springfram…...

【设计模式-桥接】

定义 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式的关键在于将类的抽象部分与其实现部分解耦&#xff0c;以便两者可以独立地变化。这种设计模式的一个主要…...

JVM JMM 专题篇 ( 12000 字详解 )

一&#xff1a;JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机&#xff0c;虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box&#xff0c;JVM 和其…...

【C++】—— list 模拟实现

【C】—— list 模拟实现 1 list 基础结构2 默认构造3 迭代器3.1 整体框架3.2 成员函数3.3 begin() 与 end() 的实现3.4 operator-> 的实现3.5 const 迭代器3.5.1 const 迭代器为什么命名 const_iterator3.5.2 const 迭代器的实现3.5.3 合并两个迭代器 4 源码 1 list 基础结…...

Redis主要问题

Redis redis是单线程&#xff0c;基于内存操作&#xff0c;所以执行很快。&#xff0c;与网络延迟有关。 还是买早餐的例子&#xff0c;从早餐店买一个包子&#xff0c;首先早餐店得还有包子没有卖完&#xff0c;然后卖出&#xff0c;包子数量-1&#xff0c;重新设定早餐店包…...

vue3 ref的用法及click事件的说明

1、ref可以定义一个简单的属性&#xff0c;也可以是一个复杂的列表、数组等等。 2、为什么要使用 ref&#xff1f;简单的let个变量不行吗&#xff1f;const个变量不行吗&#xff1f; 其实这个跟vue的响应式的系统有关&#xff0c;官方的说明如下&#xff1a; 3、为 ref() 标注…...

通信工程学习:什么是HFC混合光纤同轴电缆

HFC&#xff1a;混合光纤同轴电缆 HFC&#xff08;Hybrid Fiber Coaxial&#xff09;混合光纤同轴电缆是一种结合了光纤与同轴电缆的宽带接入网技术。以下是对HFC混合光纤同轴电缆的详细解释&#xff1a; 一、HFC混合光纤同轴电缆的定义与概述 定义&#xff1a;HFC是一种结合光…...

怎么浏览URL的PDF文件呢

最近发现PDF文件网页端打开就是丑&#xff0c;不知道怎么办 1. 看着实在不舒服&#xff0c;用chorm的插件 然后原本本地用的也是2345pdf阅读器 2. 之后也下载了adobe pdf的桌面阅读器 2345打开是这个样子 这个是现在啦 如果要一些安装包什么的&#xff0c;评论见~ 最…...

【2025届华为秋招机考三道编程题之一】华为校招留学生软件开发工程师-真题机考笔试/(200分)- 跳格子3(Java JS Python C)

华为校招机考的题型&#xff1a; 编程&#xff1a;软件测试工程师&#xff0c;算法&#xff0c;OD岗&#xff0c;三道编程题不限语言【C&#xff0c;Python&#xff0c;Java】 校招&#xff1a;600分 120分钟&#xff0c;100/200/300 社招&#xff1a;400分 150分钟&#xf…...

高性能缓存利器:Caffeine 在 Spring Boot 中的应用

在现代应用程序中&#xff0c;缓存是提高数据检索速度、减少对数据库或其他数据源访问次数的重要手段。Spring Cache 提供了多种缓存实现方式&#xff0c;而在我们的 Spring Boot 项目中&#xff0c;我们选择了 Caffeine 作为默认的缓存库。 Caffeine 简介 Caffeine 是一个基…...

pWnOS的第二种全新解法(ssh私钥破解、webmin漏洞提权)

端口 端口扫描内容请看&#xff1a;vulnhub&#xff08;8&#xff09;&#xff1a;pWnOS&#xff08;还没信息收集就已经成功打点&#xff09;-CSDN博客 打点 ssh登录公钥收集 ./2017.pl 192.168.234.116 10000 /home/vmware/.ssh/authorized_keys 0 ./2017.pl 192.168.234.11…...

Maven入门学习笔记

一、maven介绍 Maven是一款自动化构建工具&#xff0c;专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。 管理jar包 当我们使用SSM之后我们就需要使用非常多的jar包 没有maven找jar包非常的麻烦。 使用maven下载…...

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …...

【HarmonyOS】鸿蒙头像上传-(编辑个人信息页- 头像上传)+实时数据更新

#效果图 #思路 ##步骤&#xff1a; ###一、利用picker api选择1张图片 实例化选择器参数(使用new PhotoSelectOptions())实例化图片选择器 (使用newPhotoViewPicker() )调用图片选择器的select方法传入选择器参数完成图片选取获得结果 利用picker api选择1张图片 async sele…...

[数据集][目标检测]无人机识别检测数据集VOC+YOLO格式6986张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6986 标注数量(xml文件个数)&#xff1a;6986 标注数量(txt文件个数)&#xff1a;6986 标注…...

基于SSM的二手交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手交易管理系统1拥有两种角色 管理员&#xff1a;商品管理、订单管理、充值管理、用户管理等用户&#xff1a;发布商品、查看闲置、充值账户、查看所有订单、发布求购信息、修…...

linux-centos 设置系统时间

CentOS 系统提供了多种方式来设置和管理时间&#xff0c;包括手动设置时间和使用网络时间协议 (NTP) 自动同步时间。以下是几种常见的方法&#xff1a; 手动设置时间 使用date命令临时设置时间&#xff1a; 如果你只需要临时设置时间&#xff0c;可以使用 date 命令&#xff1…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...