
#打卡不停更# Linux下驱动开发_块设备驱动开发(内存模拟存储) 原创
一、前言
块设备驱动块是Linux下3大设备驱动框架之一,块设备主要是针对存储类型的设备设计的驱动,配合文件系统完成数据存储。在应用层的cp、cd、touch、vim、mount等等可以操作文件,可以操作目录的命令都会通过文件系统,通过块设备驱动完成对底层存储设备的访问,实现数据读取或者写入。
所以大致总结下:块设备驱动的目的是给Linux文件系统提供底层接口。
二、编写块设备驱动的思路
既然学到了驱动开发,了解到块设备开发。 那么看这篇文章的小伙伴应该在单片机里裸机方式写过一些flash驱动、SD卡驱动。 对于flash存储设备而言,要存取数据,根据芯片的手册我们主要是封装一个写数据函数和读取函数,封装好了这两个函数才方便上层应用的调用。 对于flash而言常见的读写单位一般是页、扇区。容量大的flash比如SD卡,读写最小单位规定为扇区。 扇区一般大小规定为512字节,那么底层要封装好的函数就是读扇区,写扇区函数。 这两个函数完成与flash空间交互,实现数据存储。
在Linux下完成块设备驱动编写,主要是要完成来至文件系统的存储请求,文件系统让你把数据存到那个扇区,你驱动就去存,文件系统让你从那个扇区读取输出来,驱动就去读取。 只要是完美的处理好了文件系统的请求,那么应用层工作就是一切顺利的。 文件系统不需要管你把数据存在什么设备上。是SD卡?是FlashW25Q64是eeprom?还是RAM内存里?对文件系统而言不关系,它只关心存进去的数据下次可以完美的读取出来便是。
那么为了方便介绍块设备的驱动开发,我这里会先用malloc在驱动申请一块内存来当做FLASH设备,这样就不需要接任何硬件,降低了难度,纯软件的方式理解驱动框架运作流程。
下面这张图是解释应用层 使用文件目录操作命令操作块设备时,与底层驱动之间的调用大致过程。
块设备与字符设备比较:
(1) 块设备设备节点名称自己定义的,没有标准。
(2)块设备的主设备号可以动态分配,次设备号时通过文件系统对块设备分区时,自动填充。
/dev/sdb fdisk命令进行分区。 /dev/sdb1 /dev/sdb2
(2)在块设备驱动里可以设置最大支持的分区数量
块设备处理数据的方式
下面是块设备驱动的数据结构:
三、块设备的示例代码
3.1 驱动代码
这份代码里存储数据的空间是申请了一段内存来模拟的。没有依赖于硬件,所以:可以在任何Linux下编译安装测试,完成块设备驱动的了解学习。
3.2 安装测试
3.3 分区之后的情况
