了解到了页高速缓存之后,页高速缓存在内核中是怎样具体与文件读写挂钩的呢,在本文中就对这个进行探究,基于:Linux-4.4.4内核源码。
一、read分析
可参考博文:linux内核分析:read过程分析
https://blog.csdn.net/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))
go