驱动应该怎么学

来源:互联网 发布:淘宝上怎么搜联通黑卡 编辑:程序博客网 时间:2024/05/03 00:29

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


(1).(2).
驱动,
驱动伴随内核而生,
由于汉语意义的丰富,所以很容易误解我们要表达的意思,
软件层面的驱动,广义上就是指这段代码操作硬件去动,控制硬件部分的逻辑,不同于电力驱动!

然后,这里要强调一点的是,裸机驱动和linux内核驱动,按严格的来说,后者应该才叫驱动,


系统API调用驱动,对上
驱动程序驱动的是硬件,对下,


驱动程序里面分为好几个层次,
你得了解和你相关的层次,而这个内容可能会很多,

驱动,难的一点,就是它包含的层面太多。


(3).
微内核和宏内核,
宏内核,单内核,是一个整体,相互之间依赖度高,一起运行在单独的地址空间
微内核,功能被划分为独立的过程,模块化程度高,一个服务失效不会影响另外一个服务,


linux本质上是宏内核,同时吸收了微内核的特点,


静态模块化,编译时实现可裁剪,需要重新编译,比如我们之前在uboot移植中的配置编译以及相关的选择,
动态模块化,不重新烧录编译,比如USB,


(4).
驱动分类,
为什么这样分类,
根据读写操作的差异,而这些差异是硬件决定的,我们软件得就着这个来写,
1.字符设备,也可以叫字节设备,以字节为单位来操控,比如串口,lcd,
2.块设备,操作时候以块为单位,块大小硬件设定,不同设备不同,物理特性决定了,不能以字节为单位来访问,
3.网络设备,专为网卡设计的驱动模型,linux中网络设备驱动是为了支持API中的socket相关的那些函数工作,


有了unix才有了网络!


字符设备驱动是非常重要的!块设备和网络设备驱动因为大多都是标准的,所以没有那么多机会去做!
USB是总线而不是设备,usb摄像头是字符设备,usb的u盘是块设备,不过具体还要看实现!

wifi不用说,肯定是网络设备,

 

在这节的后面,通过一个现实的例子,来讲解现实中这3类设备的应用,并说明为什么这3类设备驱动的重要性不同,

 


(5).
驱动程序安全性要求,
驱动是内核的一部分,
内核会以函数调用方式调用驱动程序,那函数要是有问题,那还得了,
驱动的动态安装和卸载都会更改内核,会打破原有的系统平衡,就会产生潜在的难以预料的风险,


驱动对内核的影响,
驱动的崩溃可能会使内核崩溃,
驱动的漏洞可能会造成内核安全漏洞,


常见驱动程序安全性问题,
未初始化指针,因为指针的使用实在是太多了,
恶意用户程序,用户程序利用驱动的漏洞,比如传一些恶意的参数,
缓冲区溢出,比如传太多数据导致数据覆盖,所以需要检查,
竞争状态,一些防止的措施有信号量,自旋锁,属于一种安全措施,和功能关系不大,

要形成对上述问题避免的习惯,


(6).
驱动怎么学?
高级C是针对linux内核的,
硬件的操作,还得按照linux的框架方式来操作,类似花样自行车,会骑自行车是懂操作硬件,还得按照linux的框架来花样骑。
应用层API,映射到内部实际操作硬件的函数,


框架思维,相互之间的调用,因为驱动的框架是很复杂的,没有框架思维,你会陷进去的,

比如USB本身就很复杂,再加上框架的复杂,组合起来就更复杂了,

 

用你自己的方式,总结,记录,框架!

 

还有要说的一点是,功力,即看到一个你理解的知识点,你反应的快慢程度,












0 0