Linux驱动开发-1
一、驱动
1、概念
软件层面的驱动广义上就是指这一段代码操作了硬件去动,所以这段代码就叫硬件的驱动程序。(本质上是电力提供了动力,而驱动程序提供了操作逻辑方法)
狭义上驱动程序专指操作系统中用来操控硬件的逻辑方法部分代码。
2、linux系统架构
(1)分层思想
优点:简化各层次的设计、解耦合
应用层通过调用API与系统进行通信,系统中的驱动控制硬件设备。
(2)驱动的上面是系统调用API
(3)驱动的下面是硬件
(4)驱动自身也是分层
二、模块化设计
1、微内核和宏内核
(1)宏内核(又称单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。
(2)微内核:功能被划分成独立的过程,过程间通过IPC(进程间通信)进行通信。模块化程度高,一个服务失效不会影响另一个服务。典型如Windows
(3)linux:本质上是宏内核,但是又吸收了微内核的模块化特性,体现在2个层面,静态模块化和动态模块化。
2、静态模块化
在编译时实现可裁剪。(通过宏定义,选择Y or N来选择功能的裁剪),特征是想要功能裁剪改变必须重新编译
3、动态模块化
可以不用重新编译烧录,甚至是可以不用关机重启就实现模块的安装和卸载。
三、linux设备驱动分类
一般分为3类:字符设备驱动、块设备驱动、网络设备驱动。
分类原则:设备本身读写操作的特征差异。
1、字符设备
现实场景中较多。
准确的说可以叫做“字节设备”。特征是软件操作设备时是以字节为单位来操作的,典型的如LCD、串口、LED、蜂鸣器、触摸屏等。
学习时较为重要,因为:
(1)常见的大量设备都属于字符设备;
(2)非标准类型字符设备驱动
2、块设备
相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备设计时定义好的,软件不能去更改,不同设备的块大小可以不一样。常见的块设备有硬盘、nandflash、inad、SD卡等。
3、网络设备
网络设备是专为网卡设计的驱动模型。linux中网络设备驱动主要目的是为了支持API中soket相关的那些函数工作。
四、驱动程序的安全性要求
1、驱动是内核的一部分
(1)驱动已经成为内核中最庞大的组成部分
(2)内核会直接以函数调用的方式调用驱动代码
(3)驱动的动态安装和卸载都会“更改”内核
2、驱动对内核的影响
(1)驱动程序崩溃甚至会导致内核崩溃
(2)驱动的效率会影响内核的整体效率
(3)驱动的漏洞会造成内核安全漏洞
3、常见驱动安全性问题
(1)未初始化指针
(2)恶意用户程序
(3)缓冲区溢出
(4)竞争状态