驱动开发 day3

news2024/10/6 6:02:29

总结:自动创建设备节点udev的流程

1.如何创建节点

        手动创建:mknod 地址 设备文件类型 主设备号 次设备号(0 - 255)

        自动创建:devfs (创建节点的逻辑在内核 ---> 2.4版本以前使用)

                          udev (创建节点的逻辑在应用层)

                          mdev (轻量级的udev)

2.udev的流程

       

        1> 硬件层接入,将硬件信息加载到内核层

        2> 内核层向应用层提交目录(创建设备类:struct class)

                                   和设备节点(创建设备对象:struct device)

        3>同时发起hotplug event,应用层hotplug进程收到event,通知udev进程

        4>udev进程创建/dev/设备文件,同时在/sys/class/下创建目录和文件(/sys/class/目录/文件)

3.相关API

        1> struct class *class_create(struct module *owner, const char *name)

                功能:向上提交目录,在内核创建一个struct class类型的空间并初始化

                参数: owner:模块指针,填写THIS_MODULE(宏定义,指向当前模块自身的一个指针)                             name:向上提交的目录名

                返回值:成功返回创建好的struct class类型的指针,失败返回错误码指针

        2> void class_destroy(struct class *cls)

                功能:销毁目录

                参数: cls:class_create函数创建的空间首地址

                返回值:无

        3> struct device *device_create(struct class *class, struct device *parent, dev_t devt, void                                                                 *drvdata, const char *fmt, ...)

                功能:向上提交设备节点信息,在内核生成一个struct device空间并赋值

                参数: class:class_create函数创建的空间首地址

                            parent:父节点地址,不知道填NULL

                            devt:设备号

                                        MKDEV(主设备号,次设备号):通过主设备号和次设备号得到设备号 

                                        MAJOR(dev):根据设备号得到主设备号 

                                        MINOR(dev):根据设备号得到次设备号

                            drvdata:传递到device回调函数中的参数,填写NULL即可

                            fmt:  向上提交的设备节点名 ...:可填可不填

                            返回值:成功返回创建成功的struct device空间指针,失败返回错误码指针

        4>void device_destroy(struct class *class, dev_t devt)

                功能:销毁设备节点信息

                参数: class:class_create函数创建的空间首地址

                            devt:向上提交设备信息时提交的设备号

       5> 错误码

                   

        在3-4G的内核区域,最顶层预留了4K的空间,class_create函数执行失败函数返回值对应的指针是指向这4K预留空间的。

        bool IS_ERR(const void *ptr) //(unsigned long)(void *)(x) >= (unsigned long)-MAX_ER

                功能:用于判断指针是不是指向内核顶层预留的4K空间

                返回值:如果指针指向4K预留空间,则返回真,否则返回假        

        long __must_check PTR_ERR(__force const void *ptr)

                功能:通过错误码指针得到一个错误码

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

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

相关文章

图论第一天|深度优先搜索理论基础、广度优先搜索理论基础、797.所有可能的路径

深度优先搜索理论基础 文档讲解 : 代码随想录 - 深度优先搜索理论基础Hello 算法 9.3 图的遍历 状态:开始学习。 dfs(深度优先搜索)与bfs(广度优先搜索)区别 dfs是可一个方向去搜,不到黄河不回…

视频监控/安防监控/AI视频分析/边缘计算EasyCVR平台如何调取登录接口获取token?

安防视频监控管理平台/视频汇聚/视频云存储平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、云存储、AI智能分析等,视频监控智能分析平台EasyCVR融合性强、…

(JavaEE)线程的状态

前言:进程的状态,最核心的就是 就绪状态 和 阻塞状态,这对于线程同样适用,在Java中,又赋予了线程一些其他的状态。 线程的所有状态 NEW : Thread对象已经有了,但是start 方法还没调用。TERMINATED : Thre…

uniapp H5生成画布,插入网络图片。下载画布

因为网络图片不能直接使用ctx.drawImage()插入。得使用uni.getImageInfo()方法下载后插入。 但是当画布中存在多张网络图片时,必须等待uni.getImageInfo()下载完成后才行。这样得下载套下载。太过于繁琐。所以定义了一个递归下载方法。同时避免下载图片异…

【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

文章目录 堆的概念性质图解 向上调整算法算法分析代码整体实现 向下调整算法算法分析整体代码实现 堆的接口实现初始化堆销毁堆插入元素删除元素打印元素判断是否为空取首元素实现堆 堆排序创建堆调整堆整合步骤 TopK问题 堆的概念 堆就是将一组数据所有元素按完全二叉树的顺序…

四川玖璨电子商务有限公司:新媒体视频运营

新媒体视频运营是随着互联网技术的发展而兴起的一种新型媒体运营方式。它通过制作、发布和推广优质视频内容,以吸引受众眼球,提升品牌知名度和影响力。四川玖璨电商小编在此次新媒体视频运营实验中,我们对新媒体视频运营的关键要素进行了探索…

大数据精准营销适合什么行业,面临哪些问题?

大数据营销适合的行业还是非常多的,毕竟现在大部分的企业都是通过网络方式来获得客户的,只要同领域有网站,而且他们存在竞价或者是优化,或者是使用了相关的软件,这种情况下都是完全可以运用的。比较常见的行业有金融行…

高端知识竞赛中选手台桌设计方案和配套软件

高端知识竞赛选手台桌用于知识竞赛现场选手台,集成了知识竞赛软硬件设备,包括台前计分一体机或LED屏、抢答按钮等,和天纵竞赛软件配合使用,实现高端竞赛的计分需要。 知识竞赛选手台桌前计分屏可以显示丰富的内容,包括…

(JavaEE)多线程带来的的风险-线程安全 (第一部)

前言:线程安全是整个多线程中,最为复杂的部分,也是最重要的部分。 目录 什么是线程安全问题? 线程不安全的原因 ⁜⁜总结 :线程安全问题的原因 ⁜⁜ 解决方法1 ——加锁 synchronized (监视器锁monitor…

客户画像的作用是什么?

1、深度挖掘 客户画像包括客户的基本信息和个人行为数据,这些都可以作为企业成员和客户沟通的基础,且在此基础上可以更好地共情并深度挖掘客户真正想要什么。 2、分层精细运营 根据客户画像能充分了解客户的需求,再结合产品属性和企业文化…

【memmove函数的功能介绍及模拟实现】

memmove函数的功能介绍及模拟实现✍️ 1.memmove函数的功能介绍🧐 1.1函数结构🕵️ void * memmove ( void * destination, const void * source, size_t num );1.2 功能介绍🤯 根据cplusplus网站上对memmove函数的介绍: 它的…

全栈测试平台RunnerGo你了解嘛

在当今这个数字化时代,应用程序的性能至关重要。一款可靠的性能测试工具,能够为企业带来无数的好处。最近,一款名为RunnerGo的开源性能测试工具备受瞩目。本文将详细介绍RunnerGo的特点、优势以及如何解决性能测试中的痛点。 RunnerGo产品介绍…

02-Redis持久化

上一篇:01-Redis核心数据结构与高性能原理 1.RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”…

MemJam: A false Dependency attack against constant-time crypto implementations【存储缓存】

作者:A. Moghimi, J. Wichelmann, T. Eisenbarth, and B. Sunar. 发布:International Journal of Parallel Programming 时间:Aug 2019. 笔记: 缓存定时攻击 1、攻击原理 共享缓存存在定时侧信道的风险(例如在处理…

C++信息学奥赛1168:大整数加法

#include <iostream> #include <string> #include <cstring> using namespace std;char ArrString[205], BrrString[205];// 自定义的取最大值函数 int max(int a, int b){if(a > b){return a;}else{return b;} }int main(){int len 0;cin >> ArrS…

C++11 新特性 ⑤ | 仿函数与 lambda 表达式

目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

开源大模型ChatGLM2-6B 2. 跟着LangChain参考文档搭建LLM+知识库问答系统

0. 环境 租用了1台GPU服务器&#xff0c;系统 ubuntu20&#xff0c;Tesla V100-16GB &#xff08;GPU服务器已经关机结束租赁了&#xff09; SSH地址&#xff1a;* 端口&#xff1a;17520 SSH账户&#xff1a;root 密码&#xff1a;Jaere7pa 内网&#xff1a; 3389 &#xf…

【Linux】自制shell

本期我们利用之前学过的知识&#xff0c;写一个shell命令行程序 目录 一、初始代码 二、使用户输入的ls指令带有颜色分类 三、解决cd指令后用户所在路径不变化问题 3.1 chdir函数 四、关于环境变量的问题 一、初始代码 #include<stdio.h> #include<unistd.h…

第三节:在WORD为应用主窗口下关闭EXCEL的操作(2)

【分享成果&#xff0c;随喜正能量】凡事好坏&#xff0c;多半自作自受&#xff0c;既不是神为我们安排&#xff0c;也不是天意偏私袒护。业力之前&#xff0c;机会均等&#xff0c;毫无特殊例外&#xff1b;好坏与否&#xff0c;端看自己是否能应机把握&#xff0c;随缘得度。…

Pyspark案例综合(数据计算)

数据计算 map方法 map算子 map算子&#xff08;成员方法&#xff09;接受一个处理函数&#xff0c;可用lambda快速编写&#xff0c;对RDD内的元素一一处理&#xff0c;返回RDD对象 链式调用 对于返回值是新的RDD的算子&#xff0c;可以通过链式调用的方式多次调用算子 &q…