1.哪些是驱动
确切的说,驱动是和操作系统挂钩的,在操作系统中,去操作硬件的那一段代码,能够称作硬件的驱动程序。平常在裸机程序中,去操作硬件的代码,我们不叫驱动,只是你们都习惯了,所以我们有时侯也叫裸机驱动!
linux中驱动程序通常有三个功能:对设备初始化和释放、进行内核与硬件的数据交互、检测和处理设备出现的错误!
2.硬件的调用过程
作为用户,假如在操作系统上,我们想操作某一个硬件进行动作,这么我们通常是从应用层入手编程,这么应用层是怎样操作调用硬件的呢?是通过API(驱动程序留给下层调用的插口函数)或则C库函数,C库函数就是再进行包装的API插口,API就是应用层和操作系统内核进行沟通的桥梁!
学习驱动就是须要有一个分层思想,下层应用,上层内核驱动,在驱动中,不同的设备又进行分层,复杂设备分层多linux修改文件名,简单设备分层少,层层调用linux系统好用吗,最终去操作硬件的寄存器,操作寄存器也就是操作硬件动作的最后一棒!
3.模块化设计(1)微内核和宏内核
宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,互相之间直接调用函数,简单高效。举例子:就例如一个“系统”,其显存调度、文件件管理等子系统都运行在一个地址空间,之间没有显著间隔,更像是一个整体(像uboot这些裸机程序),她们之间可以互相调用函数,这些“系统”就是单内核,由于之间是直接调用函数的,所以效率比较高。并且牵一发而动腰部,一个地方坏,其他的也用不了。
微内核:功能被界定为独立的过程,过程之间通过IPC进行通讯。模块化程度高,一个服务失效,不会影响另一服务。并且模块之间通讯比较困难,不便捷。典型的就例如windows.
(2)模块化编译
linux本质上是宏内核,并且又吸收了微内核的模块化特点,彰显在两个层面;
静态化编译
在编译的时侯可剪裁,特点是想要功能剪裁改变必须重新编译!(例如想要裁减掉内核中一个驱动,这么首先必须menuconfig图形化,把想要剪裁的那种驱动去选,之后重新编译内核产生新的Zimage,再进行启动)
动态化编译
ZImage可以不用重新编译烧写,甚至可以不死机重启就实现模块的安装和卸载。(对比先前的笔记本更换驱动,曾经更新后,须要重启笔记本linux驱动开发详解,然而如今这些在线升级的就比较多,升级驱动也不用重启才能生效)
4.linux设备驱动分类字符设备驱动
设备的读写是以字节为单位的,这些设备就称作字符设备!典型的如LCD、串口、LED、蜂鸣器、触摸屏.......
块设备驱动
块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。具体的块有多大,是由硬件决定的!不同设备的块大小可以不一样!假如想更改一个块设备的其中一个字符,那只能先把块设备的所有储存读下来,之后存到显存中linux驱动开发详解,由于显存是字节轮询的,之后定位到我们要更改的字符后,进行更改,最后,将更改过的显存存回块设备。例如,U盘就是块设备,笔记本显存就是字符设备,笔记本显存就比U盘贵的多,具体缘由就在里面解释中!常见的块设备都是储存类设备!
网路设备驱动
网路设备是专门为网卡设计的驱动模型,Linux中网路设备驱动主要目的是为了支持API中socket相关的这些函数工作。
5.驱动程序的安全性要求以及对内核影响
驱动早已成了内核中最庞大的组成部份,大约占整个内核的2/3,内核会直接以函数调用的方法嗲用驱动代码,效率很高,驱动的动态安装和卸载就会“更改内核”!
驱动程序崩溃甚至会影响内核崩溃,他的效率也会影响内核的整体效率,驱动的漏洞会导致内核安全漏洞!
常见驱动安全性问题:
(1)未初始化表针
(2)恶意用户程序,例如驱动有漏洞,应用程序借助漏洞,让内核崩溃!
(3)缓冲区溢出
(4)竞争状态