linux驱动开发1之什么是驱动?

1.什么是驱动?

字面意思驱动指驱使一个东西,让它动起来。

2.什么是linux驱动

驱动的本质是电力驱动,而驱动代码只是给出了操作方法。

3.linux体系架构

分层思想

驱动的上面是系统调用API

驱动的下面是硬件

驱动自己本身也是分层的

https://pic2.zhimg.com/50/v2-d3ea61337758b865fa2b3bc365541b35_hd.jpg

https://pic4.zhimg.com/v2-dcd432a4116bcd295db1089f214500cb_r.png

4.linux的模块化设计

4.1微内核和宏内核(也说明了linux内核的紧耦合和松耦合的概念)

  1. 宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。
  2. 微内核:功能被划分成独立的过程,过程间通过IPC(进程间通信)进行通信。模块化程度高,一个服务失效不会影响另外一个服务。典型如windows
  3. linux本质上是宏内核,但是又吸收了微内核的模块化特性,体现在2个层面。

4.2静态模块化

编译时功能可裁剪,特征是想要功能的裁剪改变必须要重新编译。

4.3动态模块化

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

5.linux设备驱动分类

5.1驱动分类

  1. 分3类:字符设备驱动、块设备驱动、网络设备驱动
  2. 分类原则:设备本身读写操作的特征差异

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

http://img.my.csdn.net/uploads/201210/25/1351159614_1702.jpg

  1. 字符设备,准确的说应该叫“字节设备”软件操作设备时是以字节为单位进行的典型的如LCD、串口、LED、蜂鸣器、触摸屏······
  2. 块设备,块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····
  3. 网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

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

  1. 常见大量设备都属于字符设备
  2. 举例说明非标准类型字符设备驱动

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

6.1驱动是内核的一部分

  1. 驱动已经成为内核中最庞大的组成部分
  2. 内核会直接以函数调用的方式调用驱动代码
  3. 驱动的动态安装和卸载都会“更改”内核

6.2驱动对内核的影响

  1. 驱动程序崩溃甚至会导致内核崩溃
  2. 驱动的效率会影响内核的整体效率
  3. 驱动的漏洞会造成内核安全漏洞

6.3常见驱动安全性问题

  1. 未初始化指针
  2. 恶意用户程序
  3. 缓冲区溢出
  4. 竞争状态

猜你喜欢

转载自blog.csdn.net/wangdapao12138/article/details/81088649