当前位置:   article > 正文

驱动怎么学_驱动工程师学习方法

驱动工程师学习方法

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){
             就截断或是怎么样?                 
     } ```

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

(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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/712649
推荐阅读
相关标签
  

闽ICP备14008679号