块设备也就是存储以“块”为单位数据的设备,比较典型的如磁盘设备、光盘或者优盘。本文首先集中在磁盘设备的相关内容的分析,其它设备类型很类似,暂时不做介绍。 在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 如何查看 块设备_理解Linux操作系统中的块设备相关推荐

  1. linux如何查看jupyter日志_在Linux服务器上运行Jupyter notebook server教程

    在Linux服务器上运行Jupyter notebook server教程 很多deep learning教程都推荐在jupyter notebook运行python代码,方便及时交互.但只在本地运行 ...

  2. linux下查看进程的线程数,linux查看进程的线程数

    top -H -p $PID  #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...

  3. 在华硕玩家国度魔霸新锐2021的Windows 11操作系统中禁用BitLocker设备加密

    在华硕玩家国度魔霸新锐2021的Windows 11操作系统中禁用BitLocker设备加密 How to disable BitLocker on Windows 11 for ASUS ROG S ...

  4. html块级标签转换,html标签中的块级元素详解

    今天,我们就讲解一下html标签中的块级元素,主要包括块级元素的概念.作用.特点,还有就是块级元素有哪些标签等内容. 块级元素概念 块级元素是一类css样式display默认值为block的html标 ...

  5. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  6. Linux查看tomcat服务进程号,linux如何查看tomcat进程_网站服务器运行维护

    linux查看端口命令是什么_网站服务器运行维护 linux查看端口命令有两种,分别是"lsof -i:"和"netstat -nltp | grep",其中参 ...

  7. linux如何查看mac地址_查看mac地址 linux_linux查看mac地址

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNXpHnwK-1660924515521)(http://img2.nlrsq.com/upfile/b13fd480 ...

  8. iptables命令_理解 Linux 下的 Netfilter/iptables

    Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月 ...

  9. linux下camera驱动分析_《Linux设备驱动程序》(五)——字符设备驱动(下)

    上一节介绍了字符驱动中的一些概念,这一节我们将会基于系统内存编写一个字符设备驱动,加深对上一节中的概念的理解. 本节主要学会的内容: 字符设备注册 对设备节点进行cat和echo操作 驱动设计 编写驱 ...

  10. arm linux udp 自发自收_嵌入式linux编程开发必备知识

    嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...

最新文章

  1. [洛谷P4722]【模板】最大流 加强版 / 预流推进
  2. linux之sed命令的用法
  3. js循环判断有无重复值_JavaScript中的while循环
  4. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例
  5. 《孵化皮克斯》读书第三天
  6. JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
  7. 阿里云更新ESC镜像
  8. appium学习链接记录
  9. 世纪互联蓝云柯文达:与更多海外云服务商共赢中国市场
  10. QML Item定位器 Anchor
  11. 2021年高处安装、维护、拆除复审考试及高处安装、维护、拆除模拟考试题
  12. VelocityTracker简单用法
  13. 用python计算有效前沿_【投资组合理论】Python绘制上证50成分股有效前沿和CML
  14. Express脚手架
  15. 普通文档怎么换成php,wps只读文档怎么修改为普通文档
  16. Oriented R-CNN完整复现HRSC2016以及训练自己的HBB数据集(DIOR)
  17. get_post X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
  18. CANopen基本原理及其应用(二)——对象字典和通讯机制
  19. Android 节操视频播放器jiecaovideoplayer使用
  20. LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。

热门文章

  1. linux7.7 离线安装nfs客户端_Linux提权姿势二:利用NFS提权
  2. for...in、for...of、forEach()有什么区别
  3. Cesium 显示CZML数据
  4. js实现无刷新表单提交文件,将ajax请求转换为form请求方法
  5. Python2.7.3 学习——准备开发环境
  6. SCVMM 2012 R2---添加Hyper-V虚拟机
  7. 简单mysql主从配置
  8. 有趣的JavaScript数组
  9. 3、Keras中的顺序模型Sequential和函数式模型Model
  10. TypeError: type ‘types.GenericAlias‘ is not an acceptable base type