Linux块设备驱动(二)————块设备的体系架构

块设备的体系架构从上到下依次为VFS虚拟文件系统、磁盘缓冲、各种类型的磁盘系统、通用块设备层、I/O调度层(优化访问上层的请求(读写请求))、块设备驱动层、块设备硬件层。

1、虚拟文件系统(VFS)
由于Linux内核支持的文件系统(NTFS、FAT、Ext2等)很多,为了使应用程序不至于对每一种文件系统单独进行操作,所以要为各种文件系统提供统一的接口,这就是VFS的由来。由来VFS,应用程序就可以使用统一的块设备操作函数处理各种文件系统。也就是说,VFS是文件系统的抽象。
2、磁盘缓冲(Disk Caches)
磁盘缓存,又称磁盘快取,实际上就是将下载到的数据先保存于系统为软件分配的内存空间中(这个内存空间被称之为"内存池"),当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏。
磁盘缓存是为了减少CPU透过I/O读取磁盘机的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速。
相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
3、磁盘文件系统(Disk Filesystem)
多个文件系统组成了一个映射层(Mapping Layer),该层主要完成如下两个工作:
a.内核确定该文件所在文件系统的块大小,并根据文件块的大小计算所请求数据的长度。本质上,文件被看作许多数据块的集合,因此内核确定请求数据所在的块号(文件开始位置的块索引)。 
b.接下来,映射层调用一个具体文件系统的函数,他访问文件的磁盘索引节点,然后根据逻辑块号确定所请求数据在磁盘上的位置。事实上,磁盘也被看作数据块的数组,因此内核必须确定存放所请求数据的块对应的号(磁盘或分区开始位置的相对索引)。由于一个文件可能存储在磁盘上的不连续块中,因此存放在磁盘索引节点中的数据结构将每个文件块号映射为一个逻辑块号。
4、通用块层(Generic Block Layer)
Linux内核为块设备抽象了统一的模型(通用块层),把块设备看作是由若干个扇区组成的数据空间。上层的读写请求在通用块层被构造层一个或者多个bio结构。每一个bio结构表示对一个扇区的读写操作。
5、通用块层下面的“I/O调度程序”根据预先定义的内核策略将待处理的I/O数据传送请求归类。调度程序的作用是把物理介质上相邻的数据请求聚集在一起。
6、最后块设备驱动程序向磁盘控制器的硬件接口发送适当的命令,从而进行实际的数据传送。
--------------------- 
作者:yangguoyu8023 
来源:CSDN 
原文:https://blog.csdn.net/yangguoyu8023/article/details/70474010 
版权声明:本文为博主原创文章,转载请附上博文链接!

发布了150 篇原创文章 · 获赞 79 · 访问量 63万+

猜你喜欢

转载自blog.csdn.net/liu0808/article/details/86589350