驱动怎么学

2023-11-11

1.什么是驱动

1.1理解驱动的概念

(1)驱动一词的字面意思

驱动就是让一个东西起来;给一个东西动力,让它动起来

(2)物理上的驱动

比如
一个球放在那儿没动,你踢了一下它,给了它一个力,给了力之后它就能动,就说明你驱动了它,这就是物理学上的驱动

(3) 硬件中的驱动

到了电学时代,一台笔记本电脑,你给它上电了,它才能动;
所以电能就相当于时驱动

(4)linux内核动

软件层面的驱动:
1>广义上就是指:

这一段代码操作了硬件去动,所以这码就叫硬件的驱动程序。
(本质上是电力提供了动力,而驱动程序提供了操作逻辑方法)

2>狭义上驱动程序就是:

专指操作系统中用来操控硬件逻辑方法部分代码
if没有内核(操作系统),就不叫驱动,只能叫裸机

1.2、linux体系架构

(1) 分层思想

为什们要分层?

1、简化各个层次的设计;
2、层次之间可以解耦合, 耦合;
3、适配;

(2)驱动的上面是系统调用(API)
上层和下层之间的关系是什么?

下层负责实现上层,上层调用下层工作

驱动存在的意义:

就是被API调用工作,驱动就是为API服务,如果API不调用驱动,那它就没有存在的意义

(3)驱动的下面是硬件

驱动就是直接工作在硬件上面

(4) 驱动自己本身也是分层的

2.模块化设计

2.1、微内核和宏内核

(1)宏内核(又称为单内核) :

概念:

内核从整体上作为一个大过程实现(直接将内核看成一个裸机程序),并同时运行在一个单独的地址空间(内核里面的代码全部在一起运行)。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效.

优点:

写起来简单,运行效率高,

缺点:

解耦合,一个地方改动,其他的就要都跟着改

(2)微内核:

概念:

功能被划分成独立的过程(内核里面有几个功能,就有几个程序构成),过程间通过IPC进行通信。

优点:

模块化程度高,一个服务失效不会影响另外一个服务。典型如windows

缺点:

运行效率低,因为ipc进程间通讯效率比较低

(3)linux:

本质上是宏内核但是吸收微内核模块化特性,体现在2个层面

2.2、静态模块化

编译时实现可裁剪,特征是想要功能的裁剪改变必须重新编译
也就是在make menuconfig里面添加减去模块

2.3、动态模块化

zImage可以不重新编译烧录,甚至可以不关机重启就实现模块的安装和卸载

比如:
U盘,直接插上电脑后,电脑不用关机,就可以自动安装驱动程序

3.linux设备驱动分类

3.1、驱动分类

(1)分3类:

字符设备驱动、
设备驱动、
网络设备驱动

(2)分类原则:

设备本身读写操作的特征差异

3.2、三类驱动程序详细对比分析

(1)字符设备(字节设备)

准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如
LCD、串口、LED、峰鸣器、触摸屏·····
比如:
LCD:是以字节为单位把像素里面的内容一个字节一个字节给传到显存上,所以LCD是一个典型的字符设备。

(2)块设备

设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小设备本身设计时定义好的,软件是不能去更改的不同设备的块大小可以不一样常见的块设备都是存储类设备
如: 硬盘、NandFlash、inand、SD···
设备是一个本身具有特殊性的一类设备不能按照字节方式去访问,因为块设备的本身物理特性决定了它不能以字节方式去访问读写
比如:
nand flash 是不能以字节去读取的,新的方式可以,但典型的块设备:硬盘是不行的,不能以字节的方式去寻址,必须得以块的方式去读写寻址

(3)网络设备

网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

为什们网络设备会被单独设计出来?

因为网络设备是有单独的接口(专用接口),专用的API
linux中的网络设备是从Unix继承过来的。

3.3、为什么字符设备驱动最重要

(1) 常见大量设备都属于字符设备

基本用到的设备都是字符设备,所以重要

(2)举例说明非标准类型字符设备驱动

非标准类:自己做的,自己定制的,为某些功能特殊做 出来的东西

4.驱动程序的安全性要求

4.1、驱动是内核的一部分

(1)驱动已经成为内核中最庞大的组成部分

(2)内核会直接以函数调用的方式调用驱动代码

意义:
如果驱动有问题,同时是函数直接调用的,函数有问题,就直接死掉了
所以驱动的位置非常关键

(3)驱动的动态安装和卸载都会“更改”内核

当你动态的安装了一个驱动之后,相当于一个内核整体上被修改了一部分
就像你往内核里面加载一个驱动,如果这个驱动写的有问题,就会造成内核的不平衡,会导致内核崩溃;

4.2、驱动对内核的影响

(1)驱动程序崩溃甚至会导致内核崩溃

(2)驱动的效率会影响内核的整体效率

比如:
驱动该用设备去写的,而你却用了字符设备去写,明明一秒钟要读一个块出来,你却是一个字节一个字节读,驱动效率大大降低,同时也会导致内核运行效率降低

(3)驱动的漏洞会造成内核安全漏洞

4.3、常见驱动安全性问题

(1)未初始化指针 //野指针

使用指针之前一定要初始化

(2)恶意用户程序

驱动层设计了用户是给以和int型数据,用户却给的是浮点型数据,而驱动程序没有想到,结果就死了。
所以写驱动的时候要考虑多方面因素

(3)缓冲区溢出

驱动程序里面定义了一个char buf[50],用于接收应用程序传过来的数据,让 网卡互发,而用户传进来的是大于这个空间的数据
比如:
用户传了60个字节,还有10字节就超出了限制,可能踩到你了,但还没踩死,但是它给你传6万个过来,而你只有50个字节的空间,后面就有很多很多超限了,可能就把你内核中用的数据冲掉了,此时if你在你的驱动里面没有做任何的检验,那么就完蛋了。
所以像这样的都要写限制条件:

     if(len>50){
             就截断或是怎么样?                 
     } ```

    如果没有做这样的判断,就会被别人坑死,这就是**缓冲区溢出**

(4)竞争状态

5.驱动应该这么学

5.1、先学好c语言

5.2、掌握相关预备知识

(1) 硬件操作方法
(2) 应用层API

5.3、驱动学习阶段

(1) 注重实践,一步一步写驱动
(2) 框架思维,多考虑整体和上下层
(3) 先通过简单设备学linux驱动框架
(4) 学会总结、记录,这会有助于理解

笔记总结于:朱有鹏老师的驱动:【朱有鹏】嵌入式5.1驱动应该怎么学

https://www.bilibili.com/video/BV1L4411t7Rjp=3&vd_source=4d939adf341b2253b2872cc9b63ce633

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

驱动怎么学 的相关文章

  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并

随机推荐

  • cookie、localStorage、sessionStorage区别 == JavaScript中let、const、var 的区别 == es6解构赋值

    cookie localStorage sessionStorage区别 Cookie Cookie设计初衷是用来和服务器通讯 而不是本地存储 他只是被 借用 到本地存储 如下图 每次http请求 header都携带cookie local
  • background-position设置无效问题解决

    2019独角兽企业重金招聘Python工程师标准 gt gt gt html代码部分 div class login div reg1 div
  • Yolov4部署到ZYNQ系列2-重新训练darknet框架下的Yolov4

    文章目录 前言 一 为什么重新训练darknet 二 改进Yolov4结构 1 其他如常 2 修改cfg文件 3 加快运行 三 改进Yolov4结构后的推测效果 总结 前言 花了一个月不到的时间单枪匹马把Yolov4模型部署到ZYNQ Ul
  • 基于Matlab的直方图、Retinex和暗通道图像去雾算法

    基于Matlab的直方图 Retinex和暗通道图像去雾算法 近年来 图像去雾技术在计算机视觉领域得到了广泛关注 由于大气雾霾和环境污染等因素 图像中会存在大量的噪点和雾霭 甚至会导致一些细节无法清晰地呈现 针对这个问题 本文将介绍一种基于
  • Kubernetes 使用 helm 部署 NFS Provisioner

    文章目录 1 介绍 2 预备条件 3 部署 nfs 4 部署 NFS subdir external provisioner 4 1 集群配置 containerd 代理 4 2 配置代理堡垒机通过 kubeconfig 部署 部署 Min
  • 使用python装饰器计算函数运行时间的实例

    使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用 如果能够熟练使用 将会大大的提高工作效率 今天就来见识一下 python 装饰器 到底是怎么工作的 本文主要是利用python装饰器计算函数运行时间 一些
  • python数据分析实例:利用爬虫获取数据

    我们在工作中用到网络上发布的各种信息 如果用搜索引擎查找并整理 需要花费大量时间 现在python能够帮助我们 使用爬虫技术 提高数据查找和整理的效率 我们来找一个爬虫的案例 抓取求职招聘类网站中的数据 使用环境 win10 python3
  • 一个开源知识管理系统,满足企业定制化需求

    编者按 知识管理是企业加强竞争优势和核心竞争力的保证 开源知识管理系统更是块 香馍馍 本文分析了知识管理系统开源的意义 介绍了开源的知识管理系统 天翎KMS的特点 并进一步阐述了天翎KMS具体实现的功能 概要 1 为什么需要开源知识管理系统
  • C++虚函数表的理解、通过虚函数表访问非public成员函数

    阅读了陈皓老师的虚函数表解析 点击打开链接 以及虚函数表存放位置一文 点击打开链接 对C 如何实现多态应该有了个粗浅认识 1 虚函数表是一个数组 每个元素存储virtual函数的指针 2 如果一个类存在虚函数 编译器一般会将该类实例的前4
  • GJB 软件测试规范

    1 目的及范围 1 1 目的 本规范规定了软件测试的具体实施方法 主要从测试过程和测试管理方面论述 软件测试的目的是验证软件是否满足软件开发合同或任务书 系统 子系统设计文档 软件需求规格说明书和软件设计说明所规定的软件质量特性要求 通过测
  • Large Graph Models: A Perspective

    本文是LLM系列文章 针对 Large Graph Models A Perspective 的翻译 TOC 摘要 大型模型已成为人工智能 尤其是机器学习领域的最新突破性成就 然而 当涉及到图形时 大型模型并没有像在自然语言处理和计算机视觉
  • sqlserver用户登录失败

    问题场景描述 刚使用sql server创建用户后 重新登录时报错说登录失败 解决方案 先使用windows登录 然后进行如下操作
  • 在主函数里面调用fun函数,这样可以吗?

    Int fun Int a 5 Int p a Return p 请问 在主函数里面调用fun函数 这样可以吗 如果不可以 请说明为什么 并给出一种解决方案 a是局部变量 a 的作用域在fun内 p指向a的地址 在return的时候 a的生
  • Node.js学习笔记--fs 文件系统 writeFile函数

    前言 本章学习fs模块中的writeFile函数 即简单文件系统 所谓的简单 其实就是一种封装 把 1 打开文件 2 关闭文件 给封装到方法里面了 这样调用者使用的时候就方便了 1 使用例 先来看一段代码 var fs require fs
  • 【图像识别】基于支持向量机svm植物叶子疾病检测和分类

    最近在学习svm算法 借此文章记录自己的学习过程 在学习很多处借鉴了z老师的讲义和李航的统计 若有不足的地方 请海涵 svm算法通俗的理解在二维上 就是找一分割线把两类分开 问题是如下图三条颜色都可以把点和星划开 但哪条线是最优的呢 这就是
  • java jmap用法_java命令--jmap命令使用

    jdk安装后会自带一些小工具 jmap命令 Java Memory Map 是其中之一 主要用于打印指定Java进程 或核心文件 远程调试服务器 的共享对象内存映射或堆内存细节 jmap命令可以获得运行中的jvm的堆的快照 从而可以离线分析
  • 设计模式6-命令模式(Command)解析+案例实践+总结

    本文是对面向对象设计模式 命令模式 Command 的解析 主要分为定义解析 通过餐厅点餐案例 遥控器案例讲解命令模式 多案例练习加深对命令模式的理解 最后总结知识要点 第一篇 定义解析 命令模式是GoF四人帮整理的 设计模式 可复用面向对
  • mysql语句声明外键

    环境 在Navicat 中进行mysql的语句操作 示例 1 创建一张员工表 CREATE TABLE employ id INT PRIMARY KEY ename VARCHAR 20 deptId INT 2 插入员工数据 INSER
  • NodeJs的应用场景及实践

    前几天看到一篇文章 据说是WordPress4 3将用NodeJs重写 着实让人有点惊讶 后来了解到 其实并不是完全摒弃PHP 而是由NodeJs重写部分核心类 具体文章链接来源 附上链接 WordPress 4 3 将用 Node js
  • 驱动怎么学

    1 什么是驱动 1 1理解驱动的概念 1 驱动一词的字面意思 驱动就是让一个东西动起来 给一个东西动力 让它动起来 2 物理上的驱动 比如 一个球放在那儿没动 你踢了一下它 给了它一个力 给了力之后它就能动 就说明你驱动了它 这就是物理学上