Linux2.6驱动程序《一》 整体概述

计算机的硬件是底层基础,是所有软件得以运行的平台,代码最终会落实为硬件上的组合逻辑与时序逻辑,软件则实现了具体应用

硬件较固定,软件则很灵活,但是软硬件之间存在着悖论,那就是软件和硬件不应该相互渗透到对方的领地

为了尽可能快速地完成设计,应用软件工程师不必关心硬件,硬件工程师不需顾及软件,例如应用工程师在调用套接字发送和接收

数据包的时候,不必关心网卡上的中断、寄存器、存储空间、I/O、片选等,这就是驱动工程师的任务

设备驱动通俗来说就是驱使硬件设备行动。

设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理和DMA通信,进行物理内存向虚拟内存的映射,最红使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据

在无操作系统的情况下,工程师可以根据硬件设备特点自行定义接口,如对串口定义SerialSend()、SerialRecv()、对LED定LightOn(),LightOff(),对Flash定义FlashWrite()、FlashRead()等,而在右操作系统的情况下,设备驱动的架构则由相应的操作系统定义

当系统有操作系统的时候

<1>无操作系统时设备驱动的硬件操作工作仍然必不可少

<2>将设备驱动融入内核,为了实现这种融合,必须在所有的设备驱动中涉及面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备

<3>设备驱动变成了连接硬件和内核的桥梁,对外呈现为操作系统的API

有了操作系统,设备驱动变得更复杂,但是一个复杂的软件系统需要处理多个并发的任务,另外,操作系统提供了内存管理机制,可以让每个进程都独立地访问4GB的内存空间,简单来说,操作系统就是给设备驱动制作麻烦来达到給上层应用提供便利的目的

Linux将存储器和外设分为3个部分:字符设备、块设备和网络设备

字符设备:以串行顺序依次进行访问的设备,如触摸屏、鼠标等

块设备:可以用任意顺序进行访问,以块为单位进行操作,如硬盘,但和字符设备没有明显的界限,例如Flash设备符合块设备特点,但我们仍然可以把它当做一个字符设备来访问

字符设备和块设备的驱动设计有很大差异,但对用户而言,他们都使用文件系统的操作接口open()、close()、read()等函数进行访问

网络设备面向数据包的接收和发送而设计,与字符设备、块设备通信方式不同

除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()等函数即可访问字符设备和块设备,块设备比字符设备复杂,要先建立一个磁盘/Flash文件系统,如FAT、JFFS2等,这些文件系统规范了文件和目录在存储介质上的组织

应用程序可以使用Linux的系统内高调用接口编程,也可以使用C库函数,考虑到移植性,后者更好些,C库函数本身也通过系统调用接口而实现,例如C库中的fopen()会调用操作系统中的oepn()

学习Linux设备驱动要先掌握如下的基础:

1、良好的硬件基础,懂得SRAM、Flash、SDRAM、磁盘的读写方式,UART,IIC、USB等设备的接口,轮询、中断、DMA原理,PCI总线工作方式及CPU内存管理单元(MMU)等

2、C语言基础,灵活应用C语言的结构体、指针、函数指针及内存动态申请和释放

3、一定的Linux内核基础,至少了解设备驱动和内核的接口,尤其对块设备、网络设备、Flash设备、串口设备等复杂设备

4、有良好的多任务并发控制和同步的基础,在设备驱动中大量使用自旋锁、互斥、信号量和等待队列等并发与同步机制

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/23958.html