基于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字符设备 定义:只能以一个字节一个字节的方式读写的设备,不能随机的读取设备中中的某一段数据,读取数据需要按照先后顺序。(字符设备是面向字节流的) 常见的字…...
 
找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。
测试工程师招了快一个月了,实在招不到合适的,已经在被解雇的边缘了。。。” 初级测试工程师非常多,但真正掌握测试思维、能力强的优秀测试太少了! 据我所知, 当下的测试人员不少状态都是这样的: 在工作中…...
 
buuctf Basic
buuctf Basic 1.Linux Labs 根据提示我们可以知道需要远程连接linux服务器,这里使用xshell进行如下配置 输入ssh的用户名root,密码123456 连接成功 构造命令 ls …/ 查看文件 查看flag cat …/flag.txt 为flag{8fee8783-1ed5-4b67-90eb-a1d603a0208…...
 
赛狐ERP|亚马逊产品缺货怎么办?该如何补救?
由于物流时效的延长,运输成本的增加,亚马逊的仓储限制等各种原因,断货问题很常成为亚马逊卖家的普遍困扰。那么亚马逊产品缺货应该怎么办!1、提高产品价格:除了卖自己的Listing此外,提高产品价格也是一种保…...
《Elasticsearch源码解读与优化实战》张超-读书笔记
写在前面 好久没更新博客了,应届狗没办法啊╮(╯▽╰)╭为了秋招搞了小半年,从去年5月到现在搞了两段实习(京东、游戏公司),最终年前拿到一家还不错的offer,现在已经入职实习了,不出意外的话以…...
 
编码踩坑——运行时报错java.lang.NoSuchMethodError / 同名类加载问题 / 双亲委派【建议收藏】
本篇介绍一个实际遇到的排查异常的case,涉及的知识点包括:类加载机制、jar包中的类加载顺序、JVM双亲委派模型、破坏双亲委派模型及自定义类加载器的代码示例;问题背景业务版本,旧功能升级,原先引用的一个二方包中的du…...
 
软件测试选Python还是Java?
目录 前言 1、先从一门语言开始 2、两个语言的区别 3、两个语言的测试栈技术 4、如何选择两种语言? 总结 前言 对于工作多年的从业者来说,同时掌握java和Python两门语言再好不过,可以大大增加找工作时的选择范围。但是对于转行的人或者…...
 
“2023数据安全智能化中国行”活动,开幕即高能
工信部等16部门近日发布的《关于促进数据安全产业发展的指导意见》提出,到2025年,数据安全产业基础能力和综合实力明显增强,数据安全产业规模超过1500亿元,年复合增长率超过30%。到2035年,数据安全产业进入繁荣成熟期。…...
 
机器人操作规划——Deep Visual Foresight for Planning Robot Motion(2017 ICRA)
1 简介 model-based RL方法,预测Action对图像的变化,以push任务进行研究。 采用完全自监督的学习方式,不需要相机标定、3D模型、深度图像和物理仿真。 2 数据集 采用几百个物体、10个7dof机械臂采集了包括5万个push attempts的数据集。 每…...
go 连接redis集群
最近用redis shake做redis数据迁移,由于redis提供的客户端没有用于查看集群的工具,且我部署的redis集群是基于k8s来构建的,没有使用ingress做转发,所以只能在k8s内部访问集群,于是我先用gogin框架编写了访问redis集群的…...
LeetCode 146. LRU 缓存
原题链接 难度:middle\color{orange}{middle}middle 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCacheLRUCacheLRUCache 类: 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++类和对象,初见类
坚持看完,结尾有思维导图总结 这里写目录标题C语言和 C 的区别类的定义类的初认识类的内容访问限定符类的作用域类的实例化类中的 this 指针总结C语言和 C 的区别 C 的祖师爷除了在 C语言的基础上化简了一些复杂操作 更为重要的是,两个语言实现的过程是…...
 
Redis常用数据结构及应用场景
1.总体结构 Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。 2.string类型 Redis中最基本的类型,它是key对应的一个单一值。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以…...
C++虚继承内存布局
C菱形继承内存布局 编译器: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以不同的维度划分,可以被分为多种类型;从工作层面划分成磁盘IO(本地IO)和网络IO; 也从工作模式上划分:BIO、NIO、AIO;从工作性质上分为阻塞式IO与非阻塞式IO;…...
 
Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速
从去年开始,Zebec 就开始以多链的形式来拓展自身的流支付生态,一方面向更多的区块链系统拓展自身流支付协议,即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署,且能够在这些EV…...
 
wpscan常见的使用方法
目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安…...
Tree 底层源码实现(二叉树、递归、迭代)
树(Tree)是一种非线性数据结构,由一组节点和它们之间的边组成。在树中,每个节点都有零个或多个子节点,除了根节点外,每个节点都有且仅有一个父节点。树可以被用于许多应用程序,如文件系统、XML文…...
 
家政服务小程序实战教程13-接入客服
小程序在微信里使用,以其无需安装随用随走为特点。但是有个问题是,如果提供商品或者服务的,用户如果有问题往往希望平台的运营方给出专业的解答。为了满足这类需求,就需要我们提供客服接入的功能,用户可以点击客服图标…...
 
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
 
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
 
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
 
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
 
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
