第1章 Linux设备驱动概述及开发环境构建
1.1 设备驱动的作用
1.2 无操作系统时的设备驱动
1.3 有操作系统时的设备驱动
1.4 Linux设备驱动
1.4.1 设备驱动分类及特点
计算机系统的硬件主要由CPU、存储器和外设组成,驱动针对的对象是存储器和外设。
分类:字符设备、块设备、网络设备。
特点:
字符设备:必须以串行顺序依次进行访问的设备,如触摸屏、鼠标;
块设备:可以按任意顺序访问,以块为单位进行操作,如硬盘、eMMC等;
字符设备和块设备对用户而言,都要使用文件系统的操作接口进行访问。
网络设备:面向数据包的接收和发送而设计,主要还是使用套接字接口。
1.4.2 Linux设备驱动与整个软硬件系统的关系
字符设备与块设备都被映射到 Linux 文件系统的文件和目录,通过文件系统的系统调用接口即可访问字符设备和块设备。
Linux 的块设备有两种访问方法:
1、类似 dd 命令对应的原始块设备,如“ /dev/sdb1”等;
2、在块设备上建立FAT、 EXT4、 BTRFS 等文件系统,然后以文件路径如“/home/barry/hello.txt”的形式进行访问。
1.4.3 Linux设备驱动的重点、难点
1、要求工程师有非常好的硬件基础,懂得 SRAM、 Flash、 SDRAM、磁盘的读写方式, UART、 I2C、 USB 等设备的接口以及轮询、中断、 DMA 的原理,PCI 总线的工作方式以及 CPU 的内存管理单元( MMU)等。
2、要求工程师有非常好的 C 语言基础,能灵活地运用 C 语言的结构体、指针、函数指针及内存动态申请和释放等。
3、要求工程师有一定的 Linux 内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要明白驱动与内核的接口。尤其是对于块设备、网络设备、 Flash 设备、串口设备等复杂设备,内核定义的驱动体系结构本身就非常复杂。
4、要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。