今天主要聊一聊块设备驱动框架的学习,块设备驱动是Linux三大驱动类型之一。块设备驱动要远比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统。
第一:块设备基本简介 块设备是针对存储设备的,比如SD卡、机械硬盘、固态硬盘等。因此块设备驱动其实就是存储设备驱动,块设备驱动相比字符设备驱动主要区别如下:1、块设备只能以块为单位进行读写访问。2、块设备在结构上是可以进行随机访问的,对这些设备的读写是按块进行的。3、字符设备是顺序的数据流设备,字符设备是按照字节进行读写访问的。字符设备不需要缓冲区,对于字符设备的访问都是实时的,而且也不需要按照固定的块大小进行访问。
第二:块设备驱动框架分析 在Linux内核使用block_device表示块设备,block_device为一个结构体,定义在include/linux/fs.h文件中,结构体内容如下:
对于block_device结构体,bd_disk成员变量,此成员变量为gendisk结构体指针类型。内核使用block_device来表示一个具体的块设备对象。第三:gendisk结构体分析 Linux内核使用gendisk来描述一个磁盘设备,这是一个结构体,定义在include/linux/genhd.h中。
和字符设备的file_operations一样,块设备有自己的操作集合,为结构体block_device_operations,此结构定义在include/linux/blkdev.h中。
上层应用程序对于块设备的读写会被构造成一个或多个bio结构。上层会将bio提交给I/O调度器,I/O调度器会将这些bio构造成request结构。
总结:块设备驱动框架是设计的技术难点比较多,熟悉块设备的配置过程非常重要,能够熟练使用内核操作块设备即可。
第一:块设备基本简介 块设备是针对存储设备的,比如SD卡、机械硬盘、固态硬盘等。因此块设备驱动其实就是存储设备驱动,块设备驱动相比字符设备驱动主要区别如下:1、块设备只能以块为单位进行读写访问。2、块设备在结构上是可以进行随机访问的,对这些设备的读写是按块进行的。3、字符设备是顺序的数据流设备,字符设备是按照字节进行读写访问的。字符设备不需要缓冲区,对于字符设备的访问都是实时的,而且也不需要按照固定的块大小进行访问。
第二:块设备驱动框架分析 在Linux内核使用block_device表示块设备,block_device为一个结构体,定义在include/linux/fs.h文件中,结构体内容如下:

对于block_device结构体,bd_disk成员变量,此成员变量为gendisk结构体指针类型。内核使用block_device来表示一个具体的块设备对象。第三:gendisk结构体分析 Linux内核使用gendisk来描述一个磁盘设备,这是一个结构体,定义在include/linux/genhd.h中。

和字符设备的file_operations一样,块设备有自己的操作集合,为结构体block_device_operations,此结构定义在include/linux/blkdev.h中。
上层应用程序对于块设备的读写会被构造成一个或多个bio结构。上层会将bio提交给I/O调度器,I/O调度器会将这些bio构造成request结构。

总结:块设备驱动框架是设计的技术难点比较多,熟悉块设备的配置过程非常重要,能够熟练使用内核操作块设备即可。