Как мне найти ответ для данного адреса? - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь написать функцию, которая защищает от записи каждый pte в данном vm_area_struct. Какая функция дает мне ptep для данного адреса? У меня есть:

pte_t *ptep;
for (addr = start; addr < end; addr += PAGE_SIZE) {
    ptep = WHATS_THIS_FUNCTION_CALLED(addr);
    ptep_set_wrprotect(mm, addr, ptep);
}

Как называется WHATS_THIS_FUNCTION_CALLED?

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Короткий ответ на ваш вопрос - использовать __get_locked_pte.Тем не менее, я бы посоветовал против этого, поскольку есть гораздо лучшие (эффективные и справедливые с точки зрения конкуренции за ресурсы) способы достижения вашей цели.

В linux типичная идиома обхода таблиц страниц - это вложенный цикл forчетыре уровня глубины (четыре - это количество уровней таблиц страниц, поддерживаемых linux).Примеры см. copy_page_range и apply_to_page_range в мм / память.c .На самом деле, если вы внимательно посмотрите на copy_page_range, он вызывается при разветвлении от dup_mmap в kernel / fork.c.Он работает по существу всего vm_area_struct.

Вы можете повторить идиому, используемую в любой из этих функций.Однако есть несколько предостережений.Например, copy_page_range полностью поддерживает прозрачные огромные страницы (2.6.38), используя полностью отдельный copy_huge_pmd внутри copy_pmd_range.Если вы не хотите писать две отдельные функции (одну для обычных страниц и одну для прозрачных огромных страниц, см. Gracefull fallback в Documentation/vm/transhuge.txt.

Дело в том, что виртуальная память в Linux очень сложна, поэтому убедитесь, чточтобы полностью понять все возможные варианты использования. follow_page in mm / memory.c должен продемонстрировать, как охватить все ваши базы.

0 голосов
/ 10 марта 2012

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

Эта функция использует pte_offset_kernel(pmd_t * dir, unsigned long address), которая принимает pmd (Страница среднего уровня) и адрес, хотя можно также использовать pte_offset(pmd_t * dir, unsigned long address).

См. Драйверы устройств Linux 3-е издание Глава 15 или Драйверы устройств Linux, 2-е изданиеГлава 13 mmap и DMA для дальнейших ссылок.

...