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