天天看点

linux驱动学习(1)-初识驱动一、什么是驱动二、驱动的定位三、驱动的模块化设计四、设备驱动分类五、驱动安全性要求

文章目录

  • 一、什么是驱动
  • 二、驱动的定位
  • 三、驱动的模块化设计
    • 3.1 宏内核
    • 3.2 微内核
    • 3.3 linux
  • 四、设备驱动分类
    • 4.1 字符设备驱动
    • 4.2 块设备驱动
    • 4.3 网络设备驱动
  • 五、驱动安全性要求
    • 5、1 驱动与内核关联
    • 5.2 驱动对内核的影响
    • 5.3 常见的驱动安全性问题

一、什么是驱动

经常遇到显卡不行了,更新显卡驱动,声卡不行了,更新声卡驱动。从我们常识上来说,驱动就是一段代码,用来驱使硬件进行工作的。所以也可以叫驱动程序。

狭义上来说,驱动是整个操作系统中用来操控硬件的逻辑方法的部分代码。

二、驱动的定位

驱动相当于一个顶梁柱,站在硬件的基础上顶起了整个操作系统的运行。

linux驱动学习(1)-初识驱动一、什么是驱动二、驱动的定位三、驱动的模块化设计四、设备驱动分类五、驱动安全性要求

驱动有很多层。但是驱动是直接对硬件进行操作,驱动和上层之间可能会有一些系统的插曲,不会像图上那样直接。

三、驱动的模块化设计

3.1 宏内核

简单来说,宏是一个整体,缺一不可,就是把内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址上运行,相互之间之直接调用函数,简单高效。

类似于,写了n个.C文件,这些文件中间有一些函数交叉调用。最后通过makefile自动编程,生成了一个可执行文件,如过其中的一个.C文件出现问题,那么是不是你的可执行文件就会出现问题,你的其余的.c文件因为调用了这个损坏的.c文件的函数,是不是这些.c文件都会出现问题,这样就麻烦了。

但是也有好处,就是你是直接调用,很快也很节省时间。类似于一荣俱荣,一损俱损。

3.2 微内核

微内核,就是一个个单独功能模块化。不同的功能之间进行IPC通讯,相互之间没有直接影响。就好像你玩英雄联盟,和队友开着QQ语音,你的QQ掉线了。你不能和队友之间语音交流了,但是不影响你玩英雄联盟,不想宏内核,你必须登录qq才能玩,不然不能玩。

3.3 linux

本质上是宏内核,但是又吸收了微内核的模块化特性,主要是体现在静态模块化和动态模块化的区分上。

什么是静态模块化呢:静态模块化就是在内核编译的时候可以进行裁剪,但是要改变的话需要重启,好像现在我们安装一些古老的应用就要需要重启电脑才行。

那么动态模块化呢:就是内核可以不用重编译,可以不用重启就行,比如现在的usb转串口,插上去就可以了,不用就弹出。

linux也是,有很多个.c文件构成。大多数文件之间可以进行直接调用,所以这就是相当于宏内核。同时在linux上也可以安装驱动,和卸载驱动,就相当于微内核。

四、设备驱动分类

一般来说设备驱动分三类:字符设备驱动、块设备驱动、网络设备驱动。

4.1 字符设备驱动

**字符设备驱动:**软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······

字符设备驱动比较重要,为什么,因为大多数设备都是属于字符设备。

同时字符设备修改也比较方便,我们可以直接找到对应的点去修改,而不用在乎其余位置,我们以后的工作大多数都是以此来展开的。

4.2 块设备驱动

**块设备驱动:**块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····操作块设备时,我们必须以块单位进行操作,将一块的数据读取到内存中去,然后在内存中找到相应的那个字节数据修改之后再以一块的数据写入到我们的块设备中去。

因为块设备驱动修改起来比较麻烦,一个块里面64个字节,其中第37个字节我们需要把里面的数字a改为b,那么我们就需要把这个块里面的所有字节读出来,然后把37的a改为b,最后就把改好了的这个64个字节写回去。所以就比较麻烦。

4.3 网络设备驱动

**网络设备驱动:**网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。这个用得比较少。因为专用与网络这块,如果后续工作需要,后面再细说。

五、驱动安全性要求

5、1 驱动与内核关联

1)你可以理解为驱动就是内核的一部分,而且驱动已经成为内核中最庞大的组成部分。

2)之前说过linux的内核有一定的宏,所以内核会直接以函数额方式调用驱动代码。

3)驱动的动态的安装和卸载都会对内核造成一定的影响(自己对内核进行改造,如果改造失败就会造成一定的影响)

5.2 驱动对内核的影响

1)驱动的崩溃可能会导致内核崩溃,因为linux内核有一定的微内核特性。

2)驱动的效率会对内核的效率造成影响。(驱动慢,造成读取文件速度慢,然后内核运行自然也就慢了)

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

5.3 常见的驱动安全性问题

1)指针没有初始化。驱动大多数会使用指针,如果没有初始化造成野指针,就会有一定影响。

2)恶意用户程序。(大多数与缓冲区溢出)

3)缓冲区溢出。(比如果我驱动缓冲区给了50个字节,但是数据传入却1000个,远远超出我们的缓冲区,那么我们我们的内存的一些数据就可能被冲掉,所以可以加一个判断 if(数据>缓冲区)怎么怎么样)。

4)竞争状态。

后面要自己多写代码,自己多练习,培养一个良好的代码习惯。

继续阅读