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

Linux系统驱动(四)自动创建设备节点

自动创建设备节点

(一)创建设备节点的机制

1. mknod

将驱动编译到内核中,在内核启动时驱动自动被安装执行

2.devfs(2.4内核)

3. udev(2.6内核至今)

在这里插入图片描述

  • 注:hotplug — 热插拔

(二)API

1. 向上提交目录

#include <linux/device.h>
struct class * class_create(owner, name)
功能:向上提交目录
参数:@owner:THIS_MODULE 这个宏和模块安装卸载相关,并且会记录模块的引用计数值。@name:目录名
返回值:成功返回结构体指针,失败返回错误码指针
  • 补:
  • 通过IS_ERR(cls)来判断是否失败。该宏定义在在cls是错误码指针时返回真,否则为假
  • 当cls是错误码指针时,可以通过PTR_ERR(cls)来获得失败返回的错误码

2. 销毁目录

#include <linux/device.h>
void class_destroy(struct class *cls)
功能:销毁向上提交目录后产生的结构体
参数:@cls:结构体指针
返回值:无

3. 向上提交创建节点的信息

struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt,...)
功能:向上提交创建节点的信息
参数:@class:指向目录的句柄@parent:填写为NULL@devt:设备号 (241,0=>(241<<20|0)MKDEV(major,minor) //将主和次设备号合成设备号MAJOR(devno);  //从设备号中获取主设备号MINOR(devno);  //从设备号中获取次设备号@drvdata:驱动的私有数据,一般填写为NULL。@fmt,...:创建节点的名字  "myled%d",i
返回值:成功返回结构体指针,失败返回错误码指针
  • 注:
  • MKDEV(ma,mi) 将主次设备号拼接成设备号
  • MAJOR(devno) 从设备号中获取主设备号
  • MINOR(devno) 从设备号中获取次设备号

4. 销毁节点的信息

void device_destroy(struct class *class, dev_t devt)
功能:销毁节点的信息
参数:@class:指向目录的句柄@devt:设备号 (241,0=>(241<<20|0)
返回值:无

5. IS_ERR(cls)的实现机制

(三)使用示例

功能需求:在上一篇驱动的基础上加入自动创建设备节点,而无需使用mknod来手动创建
需求分析
设备文件是需要在应用层的open函数就需要使用,因此在驱动中自动创建节点就必须要在mydev_open函数之前实现,因此在mydev_init函数中进行自动创建设备节点,在mydev_exit函数中进行销毁创建的设备节点
代码实现(此处只展示有修改的代码部分):
LED.c

static int __init myioctl_init(void){//入口注册设备major=register_chrdev(0,CHRNAME,&myfops); //第一个参数为0,表示由系统分配主设备号,此时返回值就是系统分配的主设备号if(major < 0){//说明出错,返回了错误码,错误码均为负数pr_err("register_chrdev error:%d\n",major);return major; //失败返回错误码}printk("major=%d\n",major);//向上提交目录mycls = class_create(THIS_MODULE,"class_name");if(IS_ERR(mycls)){//成功返回结构体指针,失败返回错误码指针//为真则说明是错误码指针pr_err("class create error:%ld\n",PTR_ERR(mycls));return PTR_ERR(mycls); //出错返回错误码}//向上提交节点信息mydev = device_create(mycls,NULL,MKDEV(major,0),NULL,"myioctl");if(IS_ERR(mydev)){//成功返回结构体指针,失败返回错误码指针//为真则说明是错误码指针pr_err("class create error:%ld\n",PTR_ERR(mydev));return PTR_ERR(mydev); //出错返回错误码}return 0; //成功返回0
}static void __exit myioctl_exit(void){//销毁节点信息device_destroy(mycls,MKDEV(major,0));//销毁目录信息class_destroy(mycls);//出口销毁设备unregister_chrdev(major,CHRNAME);
}

相关文章:

Linux系统驱动(四)自动创建设备节点

自动创建设备节点 &#xff08;一&#xff09;创建设备节点的机制 1. mknod 将驱动编译到内核中&#xff0c;在内核启动时驱动自动被安装执行 2.devfs&#xff08;2.4内核&#xff09; 3. udev&#xff08;2.6内核至今&#xff09; 注&#xff1a;hotplug — 热插拔 &…...

Webpack、Vite区别知多少?

前端的项目打包&#xff0c;我们常用的构建工具有Webpack和Vite&#xff0c;那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢&#xff1f;我们在做项目时要如何选择呢&#xff1f; 一、工具定义 1、Webpack&#xff1a;是一个强大的静态模块打包工…...

《剑指编程之巅:大学新生,以诗心驭代码》

《剑指编程之巅&#xff1a;大学新生&#xff0c;以诗心驭代码》 月华如水&#xff0c;洒落书窗&#xff0c;吾辈学子&#xff0c;正逢盛世&#xff0c;编程之术&#xff0c;已成必修之课。然则&#xff0c;编程语言如繁星点点&#xff0c;学习资源浩瀚如海&#xff0c;新生初…...

【八股文】网络基础

1.简述一下TCP和UDP的区别&#xff1f; 特性TCP&#xff08;Transmission Control Protocol&#xff09;UDP&#xff08;User Datagram Protocol&#xff09;连接类型面向连接&#xff0c;需要建立三次握手连接无连接&#xff0c;发送数据无需建立连接数据传输提供可靠的数据传…...

Nginx进阶-常见配置(一)

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…...

九/十:C语言-扫雷游戏实现与函数递归

九&#xff1a;数组和函数实践&#xff1a;扫雷游戏 1.扫雷游戏的分析和设计 &#xff08;1&#xff09;扫雷游戏功能说明&#xff1a; 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现暂停或者退出游戏扫雷的游戏界面是9*9的格子默认随机布置10个雷可以排查雷&#xff1…...

【Android Studio】gradle文件、配置、版本下载、国内源(gradle版本以及gradle-plugin版本)

文章目录 AS查看gradle-plugin版本及gradle版本&#xff08;图形&#xff09;查看gradle-plugin版本及gradle版本&#xff08;配置文件&#xff09;配置文件分析解决gradle下载失败、版本错乱等问题。 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的自动化构建工具&…...

主要的软件设计模式及其在Kotlin中的实现示例

软件设计模式&#xff08;Software Design Patterns&#xff09;是面向对象设计中常用的解决方案&#xff0c;它们为常见的软件设计问题提供了一些被证明有效的解决方案。以下是一些主要的软件设计模式及其在Kotlin中的实现示例。 创建型模式&#xff08;Creational Patterns&…...

FFmpeg音频重采样基本流程

目录 流程概述用到的APItipsdemo样例附录 - SwrContext结构体字段 流程概述 音频重采样的基本流程为&#xff1a; 申请重采样器上下文设置重采样去上下文的参数初始化重采样器申请数据存放的缓冲区空间进行重采样 注意&#xff0c;要先设置参数再对重采样器初始化 用到的API…...

无人机无人车固态锂电池技术详解

随着无人机和无人车技术的飞速发展&#xff0c;对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表&#xff0c;正逐步从实验室走向市场&#xff0c;为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池&#xff0c;固态锂电池在能量密度…...

ElementUI元件库在Axure中使用

一、ElementUI元件库介绍 ElementUI 是一套为开发者、UI/UX设计师和产品经理准备的基于Vue 2.0的桌面端组件库。它以其优雅的设计和丰富的组件&#xff0c;极大地提升了Web应用的开发效率与用户体验。ElementUI的组件设计精致且符合现代UI规范&#xff0c;包括按钮、表单、弹窗…...

联想M7615DNA打印机复印证件太黑的解决方法及个人建议

打印机在使用过程中&#xff0c;可能会出现复印的文字或图片太黑的问题&#xff0c;这会影响到打印或复印的效果。下面我们来了解一下这种情况的原因和解决方法&#xff1b;以下所述操作仅供大家参考&#xff0c;如有不足请大家提出宝贵意见&#xff1b; 证件包括&#xff1a;…...

【算法题】无重复字符的最长子串(滑动窗口)

目录 一、题目描述 二、解题思路 1、什么是滑动窗口算法&#xff1f; 2、滑动窗口一般解题模板 三、参考答案 一、题目描述 无重复字符的最长子串 给定一个字符串s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s "abcabcbb"…...

Hikari连接池 最大连接数与最小空闲连接数配置多少合适?

spring:datasource: # 数据源的相关配置type: com.zaxxer.hikari.HikariDataSource # 数据源类型&#xff1a;HikariCPdriver-class-name: com.mysql.jdbc.Driver # mysql驱动url: jdbc:mysql://localhost:3306/t…...

【2.4 python中的基本输入和输出】

2.4 python中的基本输入和输出 在Python中&#xff0c;基本输入和输出是通过内置的input()函数和print()函数来实现的。这两个函数提供了与用户或其他程序进行交互的基本方式。 1. input() 函数 input() 函数用于从标准输入设备&#xff08;通常是键盘&#xff09;接收一行文…...

netty长连接集群方案

背景 公司某拍卖系统使用的netty服务不支持集群部署,不能进行横向扩展;并且和用户聚合服务耦合在一起,服务多节点部署不能提高拍卖性能,不能支撑更多用户使用拍卖。 目前需要改造并出一个集群的方案。 思路 因为是长连接的服务做集群,需要我们在客户端和服务器建立链接…...

Python面试题:结合Python技术,如何使用Keras进行神经网络建模

使用Keras进行神经网络建模是机器学习和深度学习领域中常用的方法之一。Keras是一个高级神经网络API&#xff0c;能够在TensorFlow、Theano等后端上运行&#xff0c;提供了简单易用的接口。下面是使用Keras进行神经网络建模的基本步骤&#xff1a; 安装Keras Keras是集成在Te…...

dll文件丢失怎么恢复?超简单的5个方法,1分钟搞定dll文件修复!

DLL&#xff0c;或称动态链接库&#xff0c;是一种重要的文件类型&#xff0c;包含了一系列用于运行几乎所有程序的指令&#xff0c;这些程序在win11、win10、win8和win7系统中都广泛使用。如果Windows操作系统中的dll文件丢失&#xff0c;您可能无法正常启动所需的程序或应用。…...

[Meachines] [Easy] Sense PFSense防火墙RCE

信息收集 IP AddressOpening Ports10.10.10.60TCP:80,443 $ nmap -p- 10.10.10.60 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http lighttpd 1.4.35 |_http-title: Did not follow redirect to https://10.10.10.60/ |_http-server-header…...

codetop标签双指针题目大全解析(C++解法),双指针刷穿地心!!!

写在前面&#xff1a;此篇博客是以[双指针总结]博客为基础的针对性训练&#xff0c;题源是codetop标签双指针近一年&#xff0c;频率由高到低 1.无重复字符的最长子串2.三数之和3.环形链表4.合并两个有序数组5.接雨水6.环形链表II7.删除链表的倒数第N个节点8.训练计划II9.最小覆…...

64_《智能体微服务架构企业级实战教程》授权与认证之授权认证集成测试

前言 配套视频教程: 在 Bilibili课堂、CSDN课程、51CTO学堂 同步发售,提供:源码+部署脚本+文档。 bilibili课堂视频教程:智能体微服务架构企业级实战教程_哔哩哔哩_bilibili CSDN课程视频教程:智能体微服务架构企业级实战教程_在线视频教程-CSDN程序员研修院 51CTO学堂…...

DeepSeek基准测试避坑手册:92%开发者忽略的4大陷阱——硬件配置偏差、tokenizer不一致、batch size幻觉、温度值污染

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek基准测试避坑手册&#xff1a;92%开发者忽略的4大陷阱——硬件配置偏差、tokenizer不一致、batch size幻觉、温度值污染 硬件配置偏差&#xff1a;GPU显存与计算精度的隐性干扰 在A100&#xff08;8…...

告别手写UI!用NXP GUI Guider拖拽设计LVGL界面,5分钟搞定音乐播放器Demo

嵌入式UI开发革命&#xff1a;5分钟用GUI Guider构建LVGL音乐播放器在嵌入式系统开发中&#xff0c;用户界面(UI)设计曾长期是工程师的痛点——既要考虑资源受限的硬件环境&#xff0c;又要实现流畅美观的交互体验。传统手动编写UI代码的方式不仅效率低下&#xff0c;调试过程更…...

ARMv8 HFGITR_EL2寄存器解析与虚拟化指令陷阱控制

1. AArch64 HFGITR_EL2寄存器架构解析HFGITR_EL2&#xff08;Hypervisor Fine-Grained Instruction Trap Register&#xff09;是ARMv8架构中专门用于指令级陷阱控制的系统寄存器&#xff0c;属于虚拟化扩展的重要组成部分。这个64位寄存器通过位映射机制实现对特定AArch64指令…...

3步深度解锁:网络设备权限管理工具的实战手册

3步深度解锁&#xff1a;网络设备权限管理工具的实战手册 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否曾面对功能受限的网络设备感到束手无策&#xff1f;当默认配置锁死了硬…...

MySQL GROUP BY 原理与优化

我刚工作的时候&#xff0c;有次统计每个用户的订单总金额&#xff0c;写了 SELECT user_id, SUM(amount) FROM orders GROUP BY user_id&#xff0c;结果执行了 60 秒还没出结果。DBA 帮我一看执行计划&#xff0c;发现没走索引&#xff0c;导致 Using temporary&#xff08;用…...

多智能体谈判系统:Agent 如何通过博弈达成最优交易价格?

多智能体谈判系统&#xff1a;Agent 如何通过博弈达成最优交易价格&#xff1f;关键词 多智能体系统、自动谈判、博弈论、纳什均衡、帕累托最优、双边/多边谈判、强化学习谈判、动态定价 摘要 想象一个没有人类中介的世界&#xff1a;电商平台上的智能客服自动和批发商砍价、供…...

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

ESP32蓝牙HID实战&#xff1a;零基础打造自定义键盘鼠标 手里那块吃灰的ESP32开发板终于能派上用场了&#xff01;上周我用它做了个无线演示控制器&#xff0c;在会议室里走着就能翻PPT&#xff0c;同事们都问是怎么实现的。其实秘诀就在于ESP32的蓝牙HID功能——不需要任何USB…...

氘可来昔替尼常见副作用为鼻咽炎头痛及腹泻,如何应对

任何口服药物的临床价值&#xff0c;都必须在疗效与安全性的天平上找到精准的平衡点。氘可来昔替尼以PASI 75应答率的全面胜出证明了自己在银屑病治疗中的卓越地位&#xff0c;而其不良反应谱同样经过了严苛的临床验证。鼻咽炎、头痛和腹泻构成了这款药物最需关注的三大安全信号…...

Log4Shell漏洞深度解析:Spring Boot日志注入原理与四层修复方案

1. 这个漏洞不是“远程执行代码”那么简单——它是一次对Java生态信任链的系统性击穿Log4j CVE-2021-44228&#xff0c;业内常简称为“Log4Shell”&#xff0c;2021年12月爆发时&#xff0c;我正在给一家金融客户的Spring Boot微服务集群做灰度发布前的安全加固。凌晨三点收到告…...