绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
理解Linux操作系统中的块设备
2020-07-09 17:00:29

块设备也就是存储以“块”为单位数据的设备,比较典型的如磁盘设备、光盘或者优盘。本文首先集中在磁盘设备的相关内容的分析,其它设备类型很类似,暂时不做介绍。 在Windows操作系统下磁盘设备似乎是一个实实在在的设备,我们可以通过图形界面对磁盘设备进行管理。如图1是Windows下的磁盘管理界面,可以通过这个界面清晰的看到磁盘设备,并且可以对其进行格式化等操作。

图1 Windows磁盘设备

Linux操作系统的磁盘设备并不直观,在LInux系统中“一切皆文件”的理念下,磁盘设备其实也是一个文件,只不过是一个比较特殊的文件。如图2是某些磁盘和分区的文件路径,其中黄色字体部分是磁盘的路径,而前面红色方框内的b表示这个文件是磁盘设备文件,而非普通文件。

磁盘设备文件也是位于VFS(虚拟文件系统)下面,与Ext4等文件系统类似。用户层面可以用访问普通文件的接口(API)访问磁盘。如下代码是用Python实现的一个向磁盘写入字符串的程序。代码很简单,就是打开磁盘所在的路径(path),然后调用write函数写数据。

import os, sys 

def write_file(filename, data):
        fd = file(filename, "a+")
        fd.write(data)
        fd.close()

write_file("/dev/sdb", "itworld123")

Linux系统中磁盘的本质

通过上面的描述我们知道对于Linux操作系统来说,磁盘就是一个文件。而磁盘本身就是一个线性存储空间(可以理解为一个大数组),这种方式与文件也是非常类似的。鉴于上述相似性,Linux将磁盘设备抽象为一个文件并没有任何不妥之处。 实质上,在Linux操作系统磁盘设备是基于一个称为bdev的伪文件系统来管理的,bdev文件系统是一个在内存中的伪文件系统(在内存的文件系统,无持久化的数据),位置与Ext4等文件系统相同。如图3所示,bdev文件系统的位置为图中红色区域。



理解了块设备的管理方式,再结合我们之前对文件系统的相关介绍,这样就很容易理解后续的内容了。在文件系统相关文章介绍中我们知道,不同文件系统数据处理的关键是其提供的函数集,而这个函数集是在打开文件的时候确定的。磁盘设备也是如此,当我们打开磁盘设备时,操作系统根据磁盘设备的特性,会初始化inode中的函数集。而后续对该磁盘设备的读写操作就能通过该函数集完成。如下代码所示 ,块设备连同字符设备和管道都作为特殊的文件进行处理,并初始化对应的函数集。

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{
    inode->i_mode = mode;
    if (S_ISCHR(mode)) {
        inode->i_fop = &def_chr_fops;
        inode->i_rdev = rdev;
    } else if (S_ISBLK(mode)) {  /*块设备函数集*/
        inode->i_fop = &def_blk_fops;
        inode->i_rdev = rdev;
    } else if (S_ISFIFO(mode))
        inode->i_fop = &pipefifo_fops;
... ...

完成函数集的初始化后,当用户调用VFS层的接口是,VFS层就可以找到具体的处理函数,进而完成用户的操作。这里的函数集与本地文件系统的函数集别无二致,差异在于普通文件系统需要管理目录和文件,而这里是将磁盘看作一个大文件

磁盘的缓存

既然磁盘伪文件系统bdev本身也是一个文件系统,因此自然也可以有缓存。这个缓存就是用于提升磁盘性能的缓存系统。磁盘的缓存系统与文件系统的缓存系统类似,也是通过页缓存来实现的。当然,Linux磁盘的缓存是可以关闭的,此时将调用另外一套函数集。 这样说起来可能比较抽象,下面我们以一个具体的例子来看一下磁盘缓存的具体实现。如下是磁盘伪文件系统的函数集,我们以写数据为例进行介绍。

写数据的函数为blkdev_write_iter,该函数会调用generic_perform_write函数。如果大家阅读过本号关于文件系统的文件的话,很清楚后者就是VFS中向页缓存写数据的函数。也就是说块设备伪文件系统的逻辑与本地文件系统完全一致。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Linux技术精选专区
创建时间:2020-07-08 10:30:23
Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
戳我,来吐槽~