LINUX设备驱动开发详解----第一篇随笔
1,软件的设计宗旨呢,是高内聚,低耦合。其意思是一个驱动程序里面,尽量是自己把事情都干完,别跟其他模块或驱动牵扯太多。不然出问题的时候,就不好排查,当然这样也利于移植,只要搞清楚了驱动程序里面的代码,那换个平台,也变得轻松。
2,驱动是沟通硬件和应用的桥梁。无操作系统下的驱动一般是由一个h文件和c文件组成。h文件里面是一些结构体的定义以及提供给外部调用的函数声明,c文件就是这些函数的具体实现。无操作系统的软件结构是这样的:一个无限循环里,对设备中断的检测或轮询,并处理。 应用工程师在写代码的时候,直接面对的就是驱动接口。
3,带操作系统的驱动。ok,我们会发现,带操作系统的情况下,驱动变得复杂了,不仅要完成对硬件的操作,还要与内核对接,融入内核。干啥呢?为啥搞麻烦了呢?记住了,上帝是公平的,在驱动这边麻烦点,添加了各种设备注册等函数,就是为了在应用上的便利。使得应用看待驱动都是一个样。比如:不管你是I2C,SPI或是简单的GPIO驱动,它fopen /dev/xxx,都是打开了这个驱动,write就是往里面写东西。
4,驱动的分类:
字符设备指那些必须以串行顺序依次进行访问的设备。
块设备可以用任意顺序进行访问,为什么?经过了系统的快速缓冲。
网络设备面向数据包的接收和发送设计,没有对应的文件系统节点。
copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低。
在read和write的系统函数中,注意return的值,一般是传递的字节数。
11,Linux驱动的分析方法是点面结合,将对函数和数据结构的理解放在整体架构的背景之中。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。