2013-09-10 2 views
1

Я пытаюсь написать функцию в пространстве ядра Linux, которая просматривает кеш страницы, и ищет страницу, содержащую определенный блок.получить все страницы из кеша страницы

Я не знаю, как получить страницы в кеше страницы один за другим.

Я видел, что 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 есть код, который делает что-то вроде этого (например: когда есть запись на страницу и поиск страницы в кеше), но я ее не нашел .. .

Спасибо!

ответ

3

Структура address_space содержит все страницы в radix_tree (mapping->page_tree в вашем случае). Так что вам нужно только перебирать это дерево. Ядро Linux имеет API дерева оснований (см. here), включая итераторы 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 
Смежные вопросы