怎样进行Linux内核文件系统的分析

发布时间:2021-10-21 17:03:50 作者:柒染
来源:亿速云 阅读:122

怎样进行Linux内核文件系统的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Linux内核存储栈

  1. 总览

内核存储栈从上到下主要分为三层:1. VFS 2.Block layer 3.驱动

  1. 简单介绍

这张图来自https://blog.vmsplice.net/2020/04/how-linux-vfs-block-layer-and-device.html。主要介绍了内核中存储栈几个重要的数据结构之间的连接关系。VFS层数据结构struct block_device连接着快层数据结构struct gendisk。块层接收到VFS的请求发送到request_queue,驱动最后会响应该请求,操作最后的物理设备。

怎样进行Linux内核文件系统的分析

2.1 VFS层

2.2 Block layer层

2.3 驱动层

VFS连接着块层struct gendisk。设备驱动连接着块层和VFS层struct block_device。块层和其他两层没有直接联系,只是有驱动层注册的回调函数。

  1. 详细介绍

内核中的I/O流所经过的组件如下图所示:

怎样进行Linux内核文件系统的分析

这里列出一张内核中存储栈中主要数据结构之间的关联关系图。

怎样进行Linux内核文件系统的分析

这里追踪一个从用户空间出发的read函数调用的数据流,来分析从内核到驱动最终到物理设备硬件的过程。

3.1 内核执行系统调用sys_read响应用户空间的read操作。

3.2 在VFS层调用vfs_read通用的文件系统read接口。这里会根据具体的文件系统类型调用相应的read函数。

3.3 这里以ext4文件系统为例。会执行ext4_file_read_iter。

3.4 VFS层最主要的数据结构式bio,它定义的一系列对文件操作的具体行为。在构造了相应的bio数据结构后,会调用ext4_file_read_iter将请求提交到块层。

3.5 块层收到请求后会根据文件系统是否有定义自己的submit_bio函数来调用自定义函数还是通用submit_bio。ext4文件系统调用的是通用submit_bio。

3.6 块层对于VFS的请求不会直接提交到设备驱动去执行。而是会做合并的延迟处理,因为在物理磁盘上的寻到处理是十分耗时的操作。对于可以与请求队列中的请求进行合并的操作,会首先进行合并。否则会插入请求队列中。内核对于I/O调度有多种不同的算法:1.电梯调度 2. 最后期限算法 3. CFQ完全公平队列算法 4.预期算法 5.No Operations算法。

3.7 最后会调用驱动的queue_rq方法,将请求发送给驱动程序。不同的驱动会注册不同的queue_rq方法。这里以iscsi驱动程序为例。调用执行scsi_queue_rq方法

3.8 scsi_queue_rq会构造请求cmd,然后调用scsi_dispatch_cmd,分发cmd到底层驱动。

3.9 之后根据不同的底层设备类型,调用相应的queuecommand函数执行cmd命令。

内核的存储栈中,块层起着承上启下的作用。北向承接VFS的发送过来的IO请求,南向对接设备驱动程序,提交请求到设备驱动。这当中比较重要的几个点是:1. 块层对于I/O请求的合并优化处理。这块对于I/O的性能的影响巨大。2. 对于页高速缓存的处理。设计到如何将磁盘数据导入到内存,以及inode等数据结构如何操作访问页数据。对于很多细节好有待分析。

看完上述内容,你们掌握怎样进行Linux内核文件系统的分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. Linux内核设备驱动之虚拟文件系统的示例分析
  2. Linux内核设备驱动之proc文件系统的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux

上一篇:怎么用vue实现页面div盒子拖拽排序功能

下一篇:怎么用vue实现省市区的级联选择

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》