Linux 块设备驱动实验

前面我们都是在学习字符设备驱动,本章我们来学习一下块设备驱动框架,块设备驱动是
Linux 三大驱动类型之一。块设备驱动要远比字符设备驱动复杂得多,不同类型的存储设备又
对应不同的驱动子系统,本章我们重点学习一下块设备相关驱动概念,不涉及到具体的存储设
备。最后,我们使用ALPHA 开发板板载RAM 模拟一个块设备,学习块设备驱动框架的使用。

什么是块设备?

块设备是针对存储设备的,比如SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机
械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备
驱动的主要区别如下:
①、块设备只能以块为单位进行读写访问,块是linux 虚拟文件系统(VFS)基本的数据传输
单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。
②、块设备在结构上是可以进行随机访问的,对于这些设备的读写都是按块进行的,块设
备使用缓冲区来暂时存放数据,等到条件成熟以后再一次性将缓冲区中的数据写入块设备中。
这么做的目的为了提高块设备寿命,大家如果仔细观察的话就会发现有些硬盘或者NAND Flash
就会标明擦除次数(flash 的特性,写之前要先擦除),比如擦除100000 次等。因此,为了提高块
设备寿命引入了缓冲区,数据先写入到缓冲区中,等满足一定条件后再一次性写入到真正的物
理存储设备中,这样就减少了对块设备的擦除次数,提高了块设备寿命。
字符设备是顺序的数据流设备,字符设备是按照字节进行读写访问的。字符设备不需要缓
冲区,对于字符设备的访问都是实时的,而且也不需要按照固定的块大小进行访问。
块设备结构的不同其I/O 算法也会不同,比如对于EMMC、SD 卡、NAND Flash 这类没有
任何机械设备的存储设备就可以任意读写任何的扇区(块设备物理存储单元)。但是对于机械硬
盘这样带有磁头的设备,读取不同的盘面或者磁道里面的数据,磁头都需要进行移动,因此对
于机械硬盘而言,将那些杂乱的访问按照一定的顺序进行排列可以有效提高磁盘性能,linux 里
面针对不同的存储设备实现了不同的I/O 调度算法。

块设备驱动框架

block_device 结构体

linux 内核使用block_device 表示块设备,block_device 为一个结构体,定义在
include/linux/fs.h 文件中,结构体内容如下:

你可能感兴趣的:(正点IMX6ULL驱动开发,linux)