【linux驱动开发】-关于驱动学习你得知道的

1.什么是驱动

       准确的说,驱动是和操作系统挂钩的,在操作系统中,去操作硬件的那一段代码,才能叫做硬件的驱动程序。平时在裸机程序中,去操作硬件的代码,我们不叫驱动,只是大家都习惯了,所以我们有时候也叫裸机驱动!

       linux中驱动程序一般有三个功能:对设备初始化和释放、进行内核与硬件的数据交互、检测和处理设备出现的错误!

2.硬件的调用过程

       作为用户,如果在操作系统上,我们想操作某一个硬件进行动作,那么我们一般是从应用层入手编程,那么应用层是如何操作调用硬件的呢?是通过API(驱动程序留给上层调用的接口函数)或者C库函数,C库函数就是再进行包装的API接口,API就是应用层和操作系统内核进行沟通的桥梁!

       学习驱动就是需要有一个分层思想,上层应用,下层内核驱动,在驱动中,不同的设备又进行分层,复杂设备分层多,简单设备分层少,层层调用,最终去操作硬件的寄存器,操作寄存器也就是操作硬件动作的最后一棒!

3.模块化设计

(1)微内核和宏内核

        宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效举例子:就比如一个“系统”,其内存调度、文件件管理等子系统都运行在一个地址空间,之间没有明显间隔,更像是一个整体(像uboot这种裸机程序),他们之间可以相互调用函数,这种“系统”就是单内核,因为之间是直接调用函数的,所以效率比较高。但是牵一发而动全身,一个地方坏,其他的也用不了。

        微内核功能被划分为独立的过程,过程之间通过IPC进行通信。模块化程度高,一个服务失效,不会影响另一服务。但是模块之间通信比较困难,不方便。典型的就比如windows.

(2)模块化编译

    linux本质上是宏内核,但是又吸收了微内核的模块化特性,体现在两个层面;           

静态化编译

在编译的时候可裁剪,特征是想要功能裁剪改变必须重新编译!(比如想要裁减掉内核中一个驱动,那么首先必须menuconfig图形化,把想要裁剪的那个驱动去选,然后重新编译内核形成新的Zimage,再进行启动

动态化编译

ZImage可以不用重新编译烧录,甚至可以不关机重启就实现模块的安装和卸载。(对比以前的电脑更换驱动,以前更新后,需要重启电脑,但是现在这种在线升级的就比较多,升级驱动也不用重启就能生效

4.linux设备驱动分类 

字符设备驱动

设备的读写是以字节为单位的,这种设备就叫做字符设备!典型的如LCD、串口、LED、蜂鸣器、触摸屏.......

块设备驱动

块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。具体的块有多大,是由硬件决定的!不同设备的块大小可以不一样!如果想修改一个块设备的其中一个字符,那只能先把块设备的所有存储读出来,然后存到内存中,因为内存是字节寻址的,然后定位到我们要修改的字符后,进行修改,最后,将修改过的内存存回块设备。比如,U盘就是块设备,电脑内存就是字符设备,电脑内存就比U盘贵的多,具体原因就在上面解释中!常见的块设备都是存储类设备!

网络设备驱动

网络设备是专门为网卡设计的驱动模型,Linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

5.驱动程序的安全性要求以及对内核影响

驱动已经成了内核中最庞大的组成部分,大概占整个内核的2/3,内核会直接以函数调用的方式嗲用驱动代码,效率很高,驱动的动态安装和卸载都会“更改内核”!

驱动程序崩溃甚至会影响内核崩溃,他的效率也会影响内核的整体效率,驱动的漏洞会造成内核安全漏洞! 

常见驱动安全性问题:

(1)未初始化指针

(2)恶意用户程序,比如驱动有漏洞,应用程序利用漏洞,让内核崩溃!

(3)缓冲区溢出

(4)竞争状态

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值