了解到了页高速缓存之后,页高速缓存在内核中是怎样具体与文件读写挂钩的呢,在本文中就对这个进行探究,基于:Linux-4.4.4内核源码。
一、read分析
可参考博文:linux内核分析:read过程分析
https://blog.youkuaiyun.com/u013837209/article/details/54923508
当我们读取一个文件时,首先会检查数据是否已经缓存,如果没有就会预读取,将数据加载入缓存页。
do_generic_file_read
--> page = find_get_page(mapping, index);
在函数do_generic_file_read()函数中,该函数定义在mm/filemap.c文件中,在这里面进行了读缓存的操作。do_generic_file_read函数中有如下内容进行了缓存页的查找,这与页高速缓存查找页的接口一致。
find_page:
page = find_get_page(mapping, index); //在radix 树中查找相应的page
if (!page) {
//如果没有找到page,内存中没有该数据,先进行预读
page_cache_sync_readahead(mapping,
ra, filp,
index, last_index - index);
page = find_get_page(mapping, index);//在radix 树种再次查找相应的page
if (unlikely(page == NULL))
goto no_cached_page;
}
if (PageReadahead(page)) {
//发现找到的page已经是预读的情况了,再继续异步预读,此处是基于经验的优化
page_cache_async_readahead(mapping,
ra, filp, page,
index, last_index - index);
}
if (!PageUptodate(page)) { //数据内容不是最新,则需要更新数据内容
if (inode->i_blkbits == PAGE_CACHE_SHIFT ||
!mapping->a_ops->is_partially_uptodate)
goto page_not_up_to_date;
if (!trylock_page(page))
got

本文深入探讨Linux内核如何将页高速缓存与文件读写操作相结合。在读操作中,通过do_generic_file_read函数检查数据是否已缓存,若未缓存则预读取;而在写操作中,从ext4_file_write_iter开始,经过一系列处理,最终在ext4_write_end中完成写入,包括更新inode_size、脏页管理等。整个过程涉及多个内核函数和数据结构,如generic_perform_write和balance_dirty_pages_ratelimited。
最低0.47元/天 解锁文章
226

被折叠的 条评论
为什么被折叠?



