没有合适的资源?快使用搜索试试~ 我知道了~
首页ext4读文件流程分析
资源详情
资源评论
资源推荐

Linux 内核读文件过程
2
目 录Table of Contents
1 概述 .............................................................................................................................. 4
2 虚拟文件系统与ext4文件系统层 ................................................................................... 6
2.1 sys_read() ......................................................................................................... 6
2.1.1 fget_light()和fput_light() .......................................................................... 7
2.2 vfs_read() .......................................................................................................... 8
2.3 do_sync_read() ............................................................................................... 10
2.3.1 异步I/O ........................................................................................................... 10
2.3.2 do_sync_read() ......................................................................................... 12
2.4 generic_file_aio_read() ................................................................................... 14
2.5 do_generic_file_read() .................................................................................... 17
2.5.1 address_space->readpage()方法 .............................................................. 24
2.5.2 file_read_actor() ........................................................................................ 25
2.6 do_mpage_readpage() .................................................................................... 26
2.7 mpage_bio_submit() ....................................................................................... 31
3 读数据完成返回过程 ................................................................................................... 31
3.1 读进程的阻塞和继续执行过程 .............................................................................. 31
3.2 读数据返回过程 .................................................................................................... 34

Linux 内核读文件过程
3
图目录 List of Figures
图1 内核中块设备操作流程 ............................................................................................................ 4
图2 __lock_page()函数调用栈 ................................................................................................. 34
图3 读数据返回内核栈 ................................................................................................................. 34

Linux 内核读文件过程
4
1 概述
我们对系统调用read()非常熟悉,也常听说“零拷贝”。在看Linux内核源码时,有很多
人会有一些困惑;比如读文件的整个流程是怎样的?内核是如何Cache已经读取的文件数据?
驱动从磁盘上读取的数据是否会直接写到用户的缓冲区中?内核是在哪个地方分配空间来存储
将要读取的数据?是在哪个地方将当前进程阻塞,直至读取数据结束?“零拷贝”是如何实现
的?
本文以Redhat Enterprise Linux 6 Update 3内核版本2.6.32-279.el6.x86_64为例,分析从
用户进程通过read()读取文件,直至数据返回给用户的整个流程。
在我们分析源码之前,仍要回顾一下内核中块设备操作的流程,如图1所示。
图1 内核中块设备操作流程
对于一个进程使用系统调用read()读取磁盘上的文件。下面步骤是内核响应进程读请求的
Virtual Filesystem Switch
Generic Block Layer
Disk
Filesystem
Disk Caches
I/O Scheduler Layer
Block Device Driver Block Device
Driver
HDD
Disk
Filesystem
SSD

Linux 内核读文件过程
5
步骤;
(1)系统调用read()会触发相应的VFS(Virtual Filesystem Switch)函数,传递的参数有文
件描述符和文件偏移量。
(2)VFS确定请求的数据是否已经在内存缓冲区中;若数据不在内存中,确定如何执行读操
作。
(3)假设内核必须从块设备上读取数据,这样内核就必须确定数据在物理设备上的位置。这由
映射层(Mapping Layer)来完成。
(4)此时内核通过通用块设备层(Generic Block Layer)在块设备上执行读操作,启动I/O操作,
传输请求的数据。
(5)在通用块设备层之下是I/O调度层(I/O Scheduler Layer),根据内核的调度策略,对等待
的I/O等待队列排序。
(6)最后,块设备驱动(Block Device Driver)通过向磁盘控制器发送相应的命令,执行真正
的数据传输。
对 于( 1)、( 2)两个步骤,在《 Linux虚拟文件系统》中,我们讨论了VFS(Virtual Filesystem
Switch)主要数据结构和操作,结合相关系统调用(如sys_read()、sys_write()等)的源
码,我们不难理解VFS层相关的操作和实现。而对于第(3)步中的Mapping Layer需要结合具
体的文件系统解释,我们暂时不考虑。
在《Linux通用块设备层》中,我们分析了第(4)步。上层的I/O请求发送到通用块设备层
(Generic Block Layer)后,就会将请求继续传送到I/O调度层(I/O Scheduler Layer)。
在《Linux 内核I/O调度层》中,我们分析了第(5)步。管理块设备的请求队列,它决定队
列中的请求排序以及何时派发请求块设备。《Linux块设备驱动》分析了块设备驱动是如何处理
I/O请求及与硬件进行数据交互过程。
本文分析read()系统调用的整个过程,包括VFS、通用块设备层、I/O调度层、块设备驱
动等内容。大家可以随时参照图4 cfq_insert_request()函数调用栈,图5 mpt_put_msg_frame
()函数调用栈,这样可以明确函数调用关系和层次。
剩余34页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0