2008-11-18 6 views
2

В ядре Linux, учитывая task_structmm Я могу получить доступ к списку процессов vm_area_struct s. Учитывая эти vm_area_struct s, как мне получить struct page s, которые на самом деле соответствуют этому vma?Виртуальная область на страницы

Я пробовал искать функции в mm/memory.c и т.п., но я был в растерянности.

Редактировать: идея состоит в том, чтобы найти, какие страницы в vma находятся в настоящее время в памяти, а какие нет. Но я не хочу, чтобы кто-то сказал мне, как это сделать, поскольку это небольшая часть задания на домашнюю работу, которое мне нужно выяснить самостоятельно. Но я не могу понять, как найти страницы, которые соответствуют этому vma. Если я могу найти страницы, я полагаю, что могу проверить, имеют ли они действительный pfn или нет.

ответ

1

От комментария к другому ответу (отредактируйте: другой ответ, кажется, был удален), кажется, вы хотите читать из пользовательского пространства. Функция для получения пользовательских пространственных страниц будет get_user_pages(), но это скорее всего не то, что вы хотите; вы, вероятно, хотите copy_from_user/copy_to_user.

+0

Я считаю, что get_user_pages() генерирует ошибку страницы, когда он находит страницу, отсутствующую в физической памяти. Но я думаю, что follow_page() может сделать трюк. Дай мне проверить. – FreeMemory 2008-11-18 19:45:10

0

У меня нет прямого ответа для левой руки, но это не займет у вас много времени, чтобы перейти структуры с помощью lxr.linux.no

Учитывая у вас уже есть-структуру вы хотите, чтобы начать с , взгляните от http://lxr.linux.no/linux+v2.6.29/+code=vm_area_struct. Вы можете искать определения, видеть, где используется одна структура, и т. Д. Если вы уже знаете окончательное имя структуры, которое вы ищете, вы можете перейти в обратном направлении и перемещаться вверх, пока не достигнете миллиметра.

Обратите внимание, что если ваше сетевое соединение не так хорошо, вы можете установить локальную копию проиндексированного источника, получив пакеты lxr вашего дистрибутива и создав индекс локально. Раньше он занимал 2 часа на машине 400 МГц/128 Мбайт, в настоящее время он должен работать намного быстрее.