1

ページ キャッシュを走査し、特定のブロックを含むページを検索する関数を Linux カーネル空間に記述しようとしています。

ページキャッシュ内のページを 1 つずつ取得する方法がわかりません。

それfind_get_pageが私を助けることができる機能であることがわかりましたが、最初のページオフセットを取得する方法と続行する方法がわかりません。私が言ったように、私はそのようなことをしようとしています:

for(every page in struct address_space *mapping)
{
    for(every struct buffer_head in current_page->buffers)
    {
        check if(my_sector == current_buffer_head->b_blocknr)
            ...
    }
}

すべてのページキャッシュを調べる方法を見つけるのを手伝ってくれる人はいますか?

Linuxカーネルには、このようなことを行うコードがあると思います(たとえば、ページへの書き込みがあり、ページがキャッシュで検索された場合)が、見つかりませんでした...

ありがとう!

4

1 に答える 1

3

構造は、すべてのaddress_spaceページをradix_treemapping->page_treeあなたの場合)に保持します。したがって、必要なのはそのツリーを反復処理することだけです。Linux カーネルには、反復子を含む基数ツリー API (こちらを参照) があります。for_each例:

396 /**
397  * radix_tree_for_each_chunk_slot - iterate over slots in one chunk
398  *
399  * @slot:       the void** variable, at the beginning points to chunk first slot
400  * @iter:       the struct radix_tree_iter pointer
401  * @flags:      RADIX_TREE_ITER_*, should be constant
402  *
403  * This macro is designed to be nested inside radix_tree_for_each_chunk().
404  * @slot points to the radix tree slot, @iter->index contains its index.
405  */
406 #define radix_tree_for_each_chunk_slot(slot, iter, flags)               \
407         for (; slot ; slot = radix_tree_next_slot(slot, iter, flags))
408 
于 2013-09-10T17:51:09.847 に答える