本章将介绍read()系统调用的过程。回忆一下第一章里讲到的read()系统调用发生后VFS将调用文件实际所在文件系统的file_operations.read(),我们就从这个地方开始。

1. read():从file operation到page cache

这个过程是在file_operation.read()的核心函数:do_generic_file_read()中完成的。

虽然每种文件系统都会定义自己的file_operations,如ext2_file_operations, ext3_file_operations,但大部分最后都会使用do_generic_file_read()这个通用的函数。所以说do_generic_file_read()的实现方法体现了Linux文件系统read()的典型流程。

这个函数的作用和流程如下:


2.  read():从page cache到bio

这个过程是在a_ops->readpage()的流程里完成的。每个文件系统都会定义自己的address space operations, 即a_ops。以ext2为例,下图就是ext2_aops.readpage()的流程。


在上面的流程图中可以看到读数据的最终实现是要将buffer head对应(Map)到block device上的某个block,然后向该block device发出bio。那么从page cache和buffer head以及bio是怎样联系的呢?下一节将做详细解释。

3.  重要概念:page cache, buffer head和bio

在第一章中已经讲过kernel将文件以page为单位缓存在内存中,叫做page cache。这是从kernel管理文件的角度来看的。但是文件最终要被读写到存储介质的角度的,从读写存储介质的角度来看,文件读写最终转化为对存储介质上的某些区域的读和写。Linux里最常见的存储介质是block device,读写block device必须以block device规定的block大小为单位进行。那么page是怎样转化成block的呢?在Linux kernel里,用bio(block io)这一数据结构来代表对block device的读写,bio以block为单位组织要读写的数据。我们知道page通常大小为4096,而block的大小是由block device自己决定的,Linux kernel使用logic block为单位进行读写,Logic block size是由block device driver报告给Kernel的。Logic block size是kernel认为的读写该block device的block size。最常见的logic block size是512 bytes,也可以是1024, 2048或4096。logic block size不能超过page size,而且必须能被page size整除。这是因为Linux Kernel里将以下面的分割page的方法来把page转换成block。

以最常见的1 Page = 4096 bytes, 1 block = 512 bytes为例,1 Page分割为 8 blocks,如下图所示block 0 ~ block 7。在要发生从存储读数据到Page,如第2节所述的a_ops.readpage或将Page写到存储的时候,如下一章将要讲述的writeback的时候,Linux kernel会为page里的每个block创建一个叫buffer head(bh)的数据结构,bh的作用就是要将每个block对应到物理存储上的一个block。bh实际上是联系文件和物理存储介质的桥梁。

  • bh->b_page,bh->data指向该block在文件中的位置,实际是文件在内存中的缓存page中的位置。注意buffer head只是指向page中的位置,并没有新的buffer,所谓的buffer还是page的一块,buffer和page是同一块内存。
  • bh->b_bdev表示block在哪个block device上, bh->blocknr表示该block在存储介质上的位置。要从一个文件里的某一块block得到其位于存储介质上的位置,这是文件系统要做的翻译。做这个翻译工作就是非常重要的get_block()函数。这个翻译也叫Map。如上面的ext2_get_block(),它的工作就是根据ext2的格式算出page里的某一块在整个ext2所在partition上的对应的blocknr。更直接的说,如果/dev/sda1这个partition上是个ext2的文件系统,里面有个文件a.txt,现在要读a.txt的开头的block(512 bytes),那么ext2_get_block()就负责找到这个block在/dev/sda1上的位置。
  • bh->state代表了buffer的状态,比较重要的有BH_Mapped, BH_Uptodate和BH_Dirty。他们的含义在下图中已说明。上面所说的get_block()后bh->state就变成了BH_Mapped。

read()/write()的生命旅程之二——第二章:read()相关推荐

  1. 【《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/70544201 这篇文章是解析计算机图 ...

  2. 【转载】《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

    本文由@浅墨_毛星云 出品.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/70544201 这篇文章是解析计算机图形学界" ...

  3. 【3DMax简易入门教程】(二) 第二章 ·3DMax下的基本体创建

    3dMax第二章:基本体创建 1.标准基本体与扩展基本体组成了图形构建的主要内容,可以利用基本体内容创建桌子.电脑.沙发.凳子.门窗等内容.这里我用线条创建一个窗户框架和垃圾桶. 2.利用样条线创建一 ...

  4. 【Magicavoxel简易入门教程】(二) 第二章 · 自制一个NPC导出模型优化工具使用(附下载)

    本文由@唐三十胖子出品,转载请注明出处.   文章链接:https://blog.csdn.net/iceSony/article/details/83793754 这篇文章由唐三胖ヾ(•ω•`)o网 ...

  5. 两平面平行但不重合的条件是_____黑龙江省大庆外国语学校高中数学_第二章《2.2_直线、平面平行的判定及其性质》单元测试5_新人教A版必修3...

    黑龙江省大庆外国语学校高一数学必修二第二章<2.2 直线.平面平 行的判定及其性质>单元测试5 一.选择题1.若两个平面互相平行,则分别在这两个平行平面内的直线( ) A.平行 B.异面 ...

  6. 基于全生命周期的主数据管理:MDM详解与实战学习02 第二章 主数据管理的内涵

    第二章 主数据管理的内涵 导读 2.1 主数据的概念 2.1.1 主数据的定义 2.1.2 主数据的特征 2.1.3 主数据的范围 1.描述实体范围 2.应用层次范围 (1)元数据 (2)引用数据 ( ...

  7. 软件构造 第二章 第一节 软件生命周期和版本控制

    软件构造第二章 第一节 软件生命周期和版本控制 基本内容 Software Development Lifecycle (SDLC) Traditional software process mode ...

  8. c语言运行时更入下一行,C语言高级语言程序设计(一)_第二章 C程序设计基础(二).ppt...

    C语言高级语言程序设计(一)_第二章 C程序设计基础(二) * 问a,b能否交换?不能.示例 传值调用 如何改变参数的值?在后续章节中介绍 下:传值 * 传值的好处 下:问题3.2 * * * 使用范 ...

  9. 大二上学期总结计算机专业,计算机学生的大二第二学期自我总结-自我总结

    计算机学生的大二第二学期自我总结-自我总结 一个学期很快就过去了,但这次的心情与以前有很大不同,归心似箭的心情早被考试不理想的惆怅所掩盖.想想若是考的不好如何向父母交代?尤其这次我为了应付英语四级着实 ...

  10. Kali Linux 网络扫描秘籍 第二章 探索扫描(二)

    第二章 探索扫描(二) 作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0 2.7 使用 Scapy 发现第三层 Scapy 是一种工具,允许用户制作并向网络中注入 ...

最新文章

  1. 详细理解JS中的继承
  2. 分享一个仿就看天气应用源码
  3. SAP Spartacus category在breadcrumb里显示不正确的一个问题
  4. 网络安全设备常用默认弱口令
  5. linux系统监控命令汇总
  6. ram_flash驱动
  7. 旁站,子域名,C段的含义
  8. Ubuntu将推桌面美化计划促市场份额提升
  9. win7安装visio2016需要通用CRT(KB2999226)
  10. iis访问服务器文件夹权限设置,Windows中合理设置共享文件夹访问权限
  11. 电脑突然复制粘贴不了
  12. html重置怎么使用图片,路由器重置后怎么设置_路由器重置设置【图文教程】-太平洋IT百科...
  13. 高德地图android 缓存,高德地图定位不刷新,感觉有缓存
  14. CNPC海外操作人员英语日常用语900句
  15. Arcgis二次开发——试用arcgis online、arcgis pro
  16. python调用海康威视工业相机SDK实现图片采集
  17. V2X测试系列之认识V2X第二阶段应用场景
  18. 2015羊年,您好,在新的一年里祝大家:工作顺利,万事如意!
  19. 3.深入浅出:结型场效应管原理应用——参考《模拟电子技术基础》清华大学华成英主讲
  20. 不动点迭代方程收敛判据及MATLAB实现

热门文章

  1. HorizontalListView中setSelection方法没有实现的数据刷新的解决方法
  2. 如何将c语言转成汇编语言,如何把汇编语言转换成C语言
  3. php获取手机品牌,9 大国产手机品牌相机水印大比拼,哪款才是你的最爱?
  4. 各种说明方法的答题格式_各种轴承安装方法说明及注意事项,避免这些坑提高轴承寿命...
  5. android api文档中文版_干货分享 | Android 存储空间的最佳实践 (下)
  6. Springmvc 的post请求的json格式参数
  7. expect自动登录以及远程脚本执行
  8. SQL Server 高可用性(六)日志传送
  9. Objective-C中的位运算符用法
  10. Python Dict笔记