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

基于linux内核的驱动开发

1 字符设备驱动框架
        1.1字符设备
            定义:只能以一个字节一个字节的方式读写的设备,不能随机的读取设备中中的某一段数据,读取数据需要按照先后顺序。(字符设备是面向字节流的)
            常见的字符设备:鼠标 键盘 串口 控制台 
            块设备:可以从设备的任意位置读取一定长度数据的设备。
            常见的块设备:硬盘 磁盘 光盘 U盘 SD卡 tf卡。。
        1.2字符设备驱动框架
            init流程:--》HelloModule
                {
                    1 申请设备号(静态申请 动态申请)
                    2 创建一个字符设备
                    3 初始化字符设备
                    4 将设备号和字符设备关联起来
                }
            exit流程:--》HelloExit
                {
                    1 删除字符设备
                    2 删除设备号   
                }
        
        买车:
            1 申请车牌号(静态申请 动态申请) 陕U.88888
            2 买车
            3 将车牌号和车关联起来
        卖车:
            1 卖车
            2 注销车牌号
        
        1.2.1设备号
            定义:设备号是设备在内核中的身份和标识,是内核区分不同设备的唯一信息,设备号是由主设备号和次设备号构成,主设备号表示一类设备,次设备号表示该类设备中的某一个设备。
            设备号:是一个32bit的无符号整数,高12bit是主设备号,低20bit是次设备号。
            《linux/kdev_t.h》
            #define MINORBITS    20
            #define MINORMASK    ((1U << MINORBITS) - 1)
            #define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))
            #define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))
            #define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))
        1.2.2申请设备号
            申请设备号有两种方式:静态申请 动态申请
            静态申请设备号:
            int register_chrdev_region(dev_t from, unsigned count, const char *name)
                    作用:静态申请设备号
                    from:设备号(由主次设备号构成)
                    count:子设备个数
                    *name:设备名称
                    返回值:0 成功 非0 失败

            void unregister_chrdev_region(dev_t from, unsigned count)
                    作用:从内核中移除设备号
                    from:设备号(由主次设备号构成)
                    count:子设备个数
            动态申请设备号:
            int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
            const char *name)
                作用:动态申请设备号
                *dev:指向设备号的指针
                baseminor:子设备的第一个编号
                count:子设备个数
                *name:设备名称
                返回值:0 成功 非0 失败
        1.2.3创建字符设备
            struct cdev *cdev_alloc(void)
                作用:创建一块用于存放字符设备的空间
                返回值:是指向创建成功的字符设备的指针
                在Linux内核中用struct cdev来描述一个字符设备
        struct cdev {
            struct kobject kobj;--》内嵌的内核对象
            struct module *owner;--》该字符设备所在的内核模块的对象指针
            const struct file_operations *ops;--》指向操作字符设备的方法集
            struct list_head list;--》用来将已向内核注册的所有字符设备形成链表
            dev_t dev;--》设备号(由主设备号和次设备号构成)
            unsigned int count;--》隶属于同一个主设备号的次设备个数
            };
            void cdev_del(struct cdev *p)
                作用:删除字符设备
                *p:指向字符设备的指针
        1.2.4初始化字符设备--》绑定驱动方法
        void cdev_init(struct cdev *cdev, const struct file_operations *fops)
                作用:初始化字符设备
                *cdev:指向字符设备的指针
                *fops:指向操作字符设备的函数集的指针
        1.2.5将字符设备和设备号关联
            int cdev_add(struct cdev *p, dev_t dev, unsigned count)
            作用:将字符设备和设备号关联,并将字符设备添加到内核中
            *p:指向字符设备的指针
            dev:设备号
            count:子设备的个数
            返回值:成功为0   失败非0

        测试步骤:
            1 sudo insmod hello.ko
            2 dmesg |tail -->250 0
            3 cat /proc/devices-->查看设备号   250 0
            4 sudo mknod /dev/haha0 c 250 0
            5 ls -l /dev/haha*--->查看创建字符设备文件
            6 sudo ./test-->open hahao ok!
            7 dmesg |tail-->helloopen/helloClose
            8 sudo rmmod hello.ko
            9 sudo rm /dev/haha0

        区分字符设备驱动框架中使用的三个结构体:
            struct file:代表内核中一个打开的文件。系统中每个打开的文件在内核中都有一个关联的struct file。
            struct inode:用来记录文件在物理上的信息。它和打开文件struct file结构不同,一个文件可以对应多个struct file,但是只有一个struct inode.
            struct file_operations:是内核给用户提供的驱动接口函数集,用户可以定义函数集中的任何驱动方法。(对于不支持的一般不写)  

            字符设备文件--》250 0<--字符设备(helloopen/helloclose)
            mice----------->鼠标
            sudo cat mice
                
     2 实现用户空间和内核空间的数据拷贝
        用户代码对字符设备的任何操作,最终都要落实到设备对应的底层操作函数上
        内核空间--》用户空间     read-->HelloRead
        用户空间--》内核空间     write--》HelloWrite

        应用层 :fd=open("/dev/haha0")
                   read(fd,)
                    close(fd)
       驱动层:
            增加HelloRead
            ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        char g_buf[]="hellotest----";
        ssize_t HelloRead(struct file *pFile,char __user *buf,size_t count,loff_t *p)
            {
                copy_to_user(buf,g_buf,count);
            }

            unsigned long copy_to_user(void __user *to, const void *from, 
                                        unsigned long n)
                    作用:从内核空间向用户空间拷贝数据
                *to:用户空间指针
                *from:内核空间指针(数据源)
                n:拷贝的字节数

            copy_from_user
       
      测试步骤:
            1 sudo insmod hello.ko
            2 dmesg |tail
            3 sudo mknod /dev/haha0 c 250 0
            4 ls -l /dev/hah*
            5 sudo ./test-->查看是否读到数据?
            6 sudo rmmod hello
            7 sudo rm /dev/haha0

相关文章:

基于linux内核的驱动开发

1 字符设备驱动框架 1.1字符设备 定义&#xff1a;只能以一个字节一个字节的方式读写的设备&#xff0c;不能随机的读取设备中中的某一段数据&#xff0c;读取数据需要按照先后顺序。&#xff08;字符设备是面向字节流的&#xff09; 常见的字…...

找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。

测试工程师招了快一个月了&#xff0c;实在招不到合适的&#xff0c;已经在被解雇的边缘了。。。” 初级测试工程师非常多&#xff0c;但真正掌握测试思维、能力强的优秀测试太少了&#xff01; 据我所知&#xff0c; 当下的测试人员不少状态都是这样的&#xff1a; 在工作中…...

buuctf Basic

buuctf Basic 1.Linux Labs 根据提示我们可以知道需要远程连接linux服务器&#xff0c;这里使用xshell进行如下配置 输入ssh的用户名root&#xff0c;密码123456 连接成功 构造命令 ls …/ 查看文件 查看flag cat …/flag.txt 为flag{8fee8783-1ed5-4b67-90eb-a1d603a0208…...

赛狐ERP|亚马逊产品缺货怎么办?该如何补救?

由于物流时效的延长&#xff0c;运输成本的增加&#xff0c;亚马逊的仓储限制等各种原因&#xff0c;断货问题很常成为亚马逊卖家的普遍困扰。那么亚马逊产品缺货应该怎么办&#xff01;1、提高产品价格&#xff1a;除了卖自己的Listing此外&#xff0c;提高产品价格也是一种保…...

《Elasticsearch源码解读与优化实战》张超-读书笔记

写在前面 好久没更新博客了&#xff0c;应届狗没办法啊╮(╯▽╰)╭为了秋招搞了小半年&#xff0c;从去年5月到现在搞了两段实习&#xff08;京东、游戏公司&#xff09;&#xff0c;最终年前拿到一家还不错的offer&#xff0c;现在已经入职实习了&#xff0c;不出意外的话以…...

编码踩坑——运行时报错java.lang.NoSuchMethodError / 同名类加载问题 / 双亲委派【建议收藏】

本篇介绍一个实际遇到的排查异常的case&#xff0c;涉及的知识点包括&#xff1a;类加载机制、jar包中的类加载顺序、JVM双亲委派模型、破坏双亲委派模型及自定义类加载器的代码示例&#xff1b;问题背景业务版本&#xff0c;旧功能升级&#xff0c;原先引用的一个二方包中的du…...

软件测试选Python还是Java?

目录 前言 1、先从一门语言开始 2、两个语言的区别 3、两个语言的测试栈技术 4、如何选择两种语言&#xff1f; 总结 前言 对于工作多年的从业者来说&#xff0c;同时掌握java和Python两门语言再好不过&#xff0c;可以大大增加找工作时的选择范围。但是对于转行的人或者…...

“2023数据安全智能化中国行”活动,开幕即高能

工信部等16部门近日发布的《关于促进数据安全产业发展的指导意见》提出&#xff0c;到2025年&#xff0c;数据安全产业基础能力和综合实力明显增强&#xff0c;数据安全产业规模超过1500亿元&#xff0c;年复合增长率超过30%。到2035年&#xff0c;数据安全产业进入繁荣成熟期。…...

机器人操作规划——Deep Visual Foresight for Planning Robot Motion(2017 ICRA)

1 简介 model-based RL方法&#xff0c;预测Action对图像的变化&#xff0c;以push任务进行研究。 采用完全自监督的学习方式&#xff0c;不需要相机标定、3D模型、深度图像和物理仿真。 2 数据集 采用几百个物体、10个7dof机械臂采集了包括5万个push attempts的数据集。 每…...

go 连接redis集群

最近用redis shake做redis数据迁移&#xff0c;由于redis提供的客户端没有用于查看集群的工具&#xff0c;且我部署的redis集群是基于k8s来构建的&#xff0c;没有使用ingress做转发&#xff0c;所以只能在k8s内部访问集群&#xff0c;于是我先用gogin框架编写了访问redis集群的…...

LeetCode 146. LRU 缓存

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCacheLRUCacheLRUCache 类&#xff1a; LRUCache(intcapacity)LRUCache(int capacity)LRUCache(intcapacity) 以 正整数 …...

【mac】在m2 mbp上通过Parallels Desktop安装ubuntu22.04

文章目录前言一、参考文章二、版本信息三、方法1:通过ubuntu官网提供的iso安装3.1 配置服务器3.2 安装图形界面四、方法2:通过Parallels Desktop提供的安装包五、 小工具5.1 调整应用栏图标大小5.2 ubuntu获取mac的剪切板5.3 调整terminal字体大小5.4 安装samba5.5 ubuntu连接m…...

C++类和对象,初见类

坚持看完&#xff0c;结尾有思维导图总结 这里写目录标题C语言和 C 的区别类的定义类的初认识类的内容访问限定符类的作用域类的实例化类中的 this 指针总结C语言和 C 的区别 C 的祖师爷除了在 C语言的基础上化简了一些复杂操作 更为重要的是&#xff0c;两个语言实现的过程是…...

Redis常用数据结构及应用场景

1.总体结构 Redis中的数据&#xff0c;总体上是键值对&#xff0c;不同数据类型指的是键值对中值的类型。 2.string类型 Redis中最基本的类型&#xff0c;它是key对应的一个单一值。二进制安全&#xff0c;不必担心由于编码等问题导致二进制数据变化。所以redis的string可以…...

C++虚继承内存布局

C菱形继承内存布局 编译器&#xff1a;Visual Studio 2019 关于如何查看内存布局 B class B { public:B(): _ib(10), _cb(B){cout << "B()" << endl;}B(int ib, char cb): _ib(ib), _cb(cb){cout << "B(int,char)" << endl;}vi…...

IO模型--从BIO、NIO、AIO到内核select、poll、epoll剖析

IO基本概述 IO的分类 IO以不同的维度划分&#xff0c;可以被分为多种类型&#xff1b;从工作层面划分成磁盘IO&#xff08;本地IO&#xff09;和网络IO&#xff1b; 也从工作模式上划分&#xff1a;BIO、NIO、AIO&#xff1b;从工作性质上分为阻塞式IO与非阻塞式IO&#xff1b…...

Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速

从去年开始&#xff0c;Zebec 就开始以多链的形式来拓展自身的流支付生态&#xff0c;一方面向更多的区块链系统拓展自身流支付协议&#xff0c;即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署&#xff0c;且能够在这些EV…...

wpscan常见的使用方法

目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安…...

Tree 底层源码实现(二叉树、递归、迭代)

树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;由一组节点和它们之间的边组成。在树中&#xff0c;每个节点都有零个或多个子节点&#xff0c;除了根节点外&#xff0c;每个节点都有且仅有一个父节点。树可以被用于许多应用程序&#xff0c;如文件系统、XML文…...

家政服务小程序实战教程13-接入客服

小程序在微信里使用&#xff0c;以其无需安装随用随走为特点。但是有个问题是&#xff0c;如果提供商品或者服务的&#xff0c;用户如果有问题往往希望平台的运营方给出专业的解答。为了满足这类需求&#xff0c;就需要我们提供客服接入的功能&#xff0c;用户可以点击客服图标…...

大白话高并发(三)

背景 高并发得第三篇&#xff0c;讲一讲压测吧&#xff0c;因为我的目的是模拟100万人同时来秒杀。 是不是真的要找100万个人 没必要 &#xff0c;你就算100万人掐着表在同一毫秒内把请求请求某一台机器&#xff0c;服务器也不可能在同一时间处理那么多请求&#xff0c;因为…...

vue全家桶(四)前端工程化

vue全家桶&#xff08;四&#xff09;前端工程化1.模块化的相关规范1.1模块化概述1.2模块化的分类A.浏览器端的模块化B.服务器端的模块化C.ES6模块化1.2.1 Node.js中通过bable体验ES6模块化1.2.2 ES6模块化的基本语法1.2.2.1 默认导出与默认导入1.2.2.2 按需导出与按需导入1.2.…...

超螺旋滑模控制(STA)

超螺旋滑模控制(Super Twisting Algorithm, STA) 超螺旋滑模控制又称超扭滑模控制&#xff0c;可以说是二阶系统中最好用的滑模控制方法。 系统模型 对于二阶系统可以建立具有标准柯西形式的微分方程组 {x˙1x2x˙2fg⋅u\begin{cases} \dot x_1 x_2 \\ \dot x_2 f g \cdo…...

NX二次开发编译时dll自动数字签名及拷贝

前言 在UG5.0开始&#xff0c;所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 一、基于C# 开发签名 1、添加资源文件 &#xff08;1&#xff09;项目类库上右键–>属性–>资源–>添加资源右边小三角–>添加现有文件–>切换到UG安装目录下…...

教你如何搭建人事OA-薪资管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建人事OA-薪资管理。1.2、应用场景根据设置薪资基础及考勤和绩效的数据计算得到各个员工工资详情。2、设置方法2.1、表单搭建1&#xff09;新建表单【工资表】&#xff0c;字段设置如下&#xff1b;名称类型名称类型人员资料分…...

ChIP-seq 分析:Mapped 数据可视化(4)

1. Mapped reads 现在我们有了 BAM 文件的索引&#xff0c;我们可以使用 idxstatsBam() 函数检索和绘制映射读取的数量。 mappedReads <- idxstatsBam("SR_Myc_Mel_rep1.bam")TotalMapped <- sum(mappedReads[, "mapped"])ggplot(mappedReads, aes(x…...

Jenkins 基于Kubernetes 弹性构建池

流程&#xff1a;创建Jenkins Agent&#xff1b;获取Jenkins Agent的参数&#xff1b;渲染yaml模板&#xff1b;调用K8s API在固定的NS中创建一个Pod&#xff1b;运行Jenkins pipeline到agent&#xff1b;创建Agentimport hudson.model.Node.Mode import hudson.slaves.* impor…...

经典算法题---链表奇偶重排(好题)双指针系列

我听别人说这世界上有一种鸟是没有脚的&#xff0c;它只能够一直的飞呀飞呀&#xff0c;飞累了就在风里面睡觉&#xff0c;这种鸟一辈子只能下地一次&#xff0c;那一次就是它死亡的时候。——《阿甘正传》这一文章讲解链表的奇偶排序问题&#xff0c;这是一道不难但是挺好的链…...

数据仓库实战

目录1、最佳实战1.1 表的分类1.2 ETL策略1.3 任务调度2、项目实战2.1 项目概述2.2 数据描述2.3 架构设计2.4 环境搭建2.5 项目开发1、最佳实战 1.1 表的分类 维度建模中表的类型&#xff1a;事实表和维度表 事实表又可以分为&#xff1a;事务事实表、周期快照事实表、累积快照…...

GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)

&#x1f604; 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构&#xff1a;1.2、范式&#xff1a;预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式&#xff1a;预…...

群晖 nas 做网站/营销策划思路

文章目录一、vim常用操作1.1 插入命令1.2 定位命令1.3 删除命令1.4 复制和剪切命令1.5 替换和取消命令1.6 搜索和搜索替换命令1.7 保存和退出命令一、vim常用操作 下一篇&#xff1a;Vim使用技巧——有趣又能提高效率的小技巧 https://blog.csdn.net/weixin_46818279/article/…...

前端会员中心wordpress/杭州百度开户

【算法分析】 简单而言&#xff0c;将中缀表达式转换为后缀表达式的算法需要注意以下两点。 ● 操作数始终入操作数栈。 ● 操作符入操作符栈时&#xff0c;比较与操作符栈的栈顶元素的优先级&#xff0c;然后选择入操作符栈还是入操作数栈。直至将操作符栈的所有元素入操作数栈…...

网站备案号位置/深圳网络推广哪家

风险管理的含义和类别 风险敞口 未加保护的风险&#xff0c;也成“风险暴露”。 在某个项目、项目集或项目组合中&#xff0c;针对任一特定对象&#xff0c;而适时作出的对所有风险的潜在影响的综合评估。 单个项目风险 vs 整体项目风险 案例&#xff1a;田忌赛马、杀毒软件 变…...

icp备案要多少钱/标题优化seo

javaone目前&#xff0c;成千上万的Java开发人员正在前往旧金山参加今年的JavaOne和OpenWorld会议。 会议于10月25日&#xff08;星期日&#xff09;开始&#xff0c;预计将吸引6万名与会者&#xff0c;并持续到10月29日。 那些没有拿到75美元的JavaOne主旨票或2050美元的全会…...

wordpress 获取分类文章/长沙网站seo分析

首先从 左侧的折叠菜单 开始。看图。 2. CSS 代码 以下是自定义的css代码&#xff0c;由于系统是内部使用&#xff0c;所以优先考虑chrome,firefox 不考虑IE了。 #main-nav {margin-left: 1px;}#main-nav.nav-tabs.nav-stacked > li > a { padding: 10px 8px; font-size:…...

ksweb wordpress/百度推广外推联系方式

当前的CPU和GPU是分立设计的处理器,不能高效率地协同工作,编写同时运行于CPU和GPU的程序也是相当麻烦。由于CPU和GPU拥有独立的地址空间,应用程序不得不明确地控制数据在CPU和GPU之间的流动。CPU代码通过系统调用向GPU发送任务,此类系统调用一般由GPU驱动程序管理,而驱动程…...