Linux块设备驱动总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hearbeat/article/details/80531005

1.之前我们学的都是字符设备驱动,先来回忆一下

字符设备驱动:

当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠标、键盘等

 

2.接下来本节开始学习块设备驱动

块设备:

块设备是i/o设备中的一类, 当我们的应用层对该设备读写时,是按扇区大小来读写数据的,若读写的数据小于扇区的大小,就会需要缓存区, 可以随机读写设备的任意位置处的数据,例如 普通文件(*.txt,*.c等),硬盘,U盘,SD卡,

 

3.块设备结构:

  • 段(Segments):由若干个块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。
  • 块  (Blocks):   由Linux制定对内核或文件系统等数据处理的基本单位。通常由1个或多个扇区组成。(对Linux操作系统而言)
  • 扇区(Sectors):块设备的基本单位。通常在512字节到32768字节之间,默认512字节

 

4.我们以txt文件为例,来简要分析下块设备流程:

比如:当我们要写一个很小的数据到txt文件某个位置时, 由于块设备写的数据是按扇区为单位,但又不能破坏txt文件里其它位置,那么就引入了一个“缓存区”,将所有数据读到缓存区里,然后修改缓存数据,再将整个数据放入txt文件对应的某个扇区中,当我们对txt文件多次写入很小的数据的话,那么就会重复不断地对扇区读出,写入,这样会浪费很多时间在读/写硬盘上,所以内核提供了一个队列的机制,再没有关闭txt文件之前,会将读写请求进行优化,排序,合并等操作,从而提高访问硬盘的效率

(PS:内核中是通过elv_merge()函数实现将队列优化,排序,合并,后面会分析到)

5.接下来开始分析块设备框架

当我们对一个*.txt写入数据时,文件系统会转换为对块设备上扇区的访问,也就是调用ll_rw_block()函数,从这个函数开始就进入了设备层.

猜你喜欢

转载自blog.csdn.net/Hearbeat/article/details/80531005