我们对系统调用read()非常熟悉,也常听说“零拷贝”。在看Linux内核源码时,有很多人会有一些困惑:比如读文件的整个流程是怎样的?内核是如何Cache已经读取的文件数据?驱动从磁盘上读取的数据是否会直接写到用户的缓冲区中?内核是在哪个地方分配空间来存储将要读取的数据?是在哪个地方将当前进程阻塞,直至读取数据结束?“零拷贝”是如何实现的?
本文以Redhat Enterprise Linux 6 Update 3内核版本2.6.32-279.el6.x86_64为例,分析从用户进程通过read()读取文件,直至数据返回给用户的整个流程。
目 录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内核读文件过程
看了一些博主的文字,博主对linuxkernel的见解非常深啊!希望博主能出门书,或者推荐一些书指导我等小菜
谢谢肯定。推荐书籍,在之前推荐过。不过都是英文书为主,很多有中文翻译版本的。
http://ilinuxkernel.com/?p=59
博主您好,首先感谢您的分享,很想看您文章中提到的“在另外的章节中单独介绍Linux内核预读和Cache机制”,可否告知一下该章节的文章链接,非常感谢
https://ilinuxkernel.com/?p=1700