1. linux设备的分类及特点
计算机系统的硬件主要由CPU、存储器和外设组成。驱动程序针对的对象是存储器和外设,包括现在CPU内部集成的存储器和外设,并不针对CPU内核。linux将存储器和外设分为3大基础类:
- 字符设备
必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。
- 块设备
可以按任意顺序进行访问,以块为单位进行操作的设备。如磁盘、eMMC等。
- 网络设备
面向数据包的接受和发送而设计,内核与网络设备的通信依赖于套接字接口。
2.linux设备驱动与整个软硬件系统的关系
除了网络设备以外,字符设备与块设备都被映射到linux文件系统的文件和目录,通过文件系统的系统调用接口访问。如open()、write()、read()、clsoe()等。所有字符设备和块设备都统一呈现给用户。块设备的访问方式上分两种:第一种方法是类似dd命令对应原始的块设备,如"/dev/sdb1"等;第二种方法是在块设备上建立FAT/EXT4/BTRFS等文件系统,然后以文件路径的形式进行访问。在linux中,针对NOR、NAND等提供了独立的内存技术设备子系统,如YAFFS2、JFFS2、UBIFS等具备负载均衡能力的文件系统。针对磁盘或Flash设备的FAT、EXT4、YAFFS2、JFFS2、UBIFS等文件系统,其系统定义了文件和目录在存储介质上的组织。而linux的虚拟文件系统则统一对它们进行了抽象。
3.linux设备驱动学习的重点与难点
linux设备驱动学习是一项浩瀚的工程,包括:
- 编写linux设备驱动要求良好的硬件基础,需要学习SRAM、Flash、SDRAM、磁盘的读写方式,UART、IIC、USB等设备接口以及轮询、中断、DMA的原理。还有PCI总线的工作方式和CPU的MMU(内存管理单元)。
- 扎实的C语言基础,灵活使用C语言的结构体、指针、函数指针以及动态内存分配等等。
- 了解一定的linux内核基本知识,至少明白驱动与内核的接口。如块设备、网络设备、Flash设备、串口设备等。
- 掌握UNIX高级环境编程中的多任务并发控制和同步机制,譬如自旋锁、互斥、信号量、等待队列等。