2016-05-31 3 views
2

Мне нужно получить физический адрес огромной страницы (2 МБ) из пользовательского пространства. Мне удалось получить физический адрес обычной страницы 4 КБ с pagemap, как показано в https://shanetully.com/2014/12/translating-virtual-addresses-to-physcial-addresses-in-user-space/#codeprocpidpagemapcode, однако я не понимаю, как использовать pagemap для получения физического адреса огромной страницы. Как представлен номер страницы страницы с огромной страницей в pagemap? Любые ссылки и особенно любой фрагмент кода будут высоко оценены.Как получить физический адрес огромной страницы

+1

Вы прочитали [документацию для pagemap] (https://www.kernel.org/doc/Documentation/vm/pagemap.txt)? Это даже ссылка на ссылку, которую вы предоставили. В частности, раздел, описывающий «COMPOUND_HEAD» и «COMPOUND_TAIL». – kaylum

+0

Я искал документацию pagemap, но в разделе ОГРОМНОЕ, которое мало говорило. Итак, согласно COMPOUND_HEAD и COMPOUND_TAIL начало моего буфера в 2 МБ должно быть головой, поэтому любое место в первых 4 Кбайтах моего буфера должно отображаться на PFN всей огромной страницы? Как я должен интерпретировать значение? Должен ли я ожидать 9 нулей в конце PFN? И рассмотрите бит 10 и выше как биты физической памяти, расширяющие мое смещение? – alex10791

ответ

1

Это должно быть то же самое. Основное различие между обычными страницами и огромными страницами - это несколько слоев таблиц страниц. Начальная страница страницы заканчивается для огромных страниц (по крайней мере, на x86).

Огромные страницы, как правило, заканчиваются более нулями, чем типичные страницы, так как они должны быть выровнены по их размеру (в случае 2 МБ низкие 21 бит должны быть равны нулю).

Если вы получаете -EINVAL от вашего чтения, проверить эту цитату из pagemap documentation (пример считывает неправильное число байтов):

Чтение любой из файлов будет возвращать -EINVAL если вы не являются , начиная с чтения на 8-байтной границе (например, если вы искали нечетное число байтов в файле), или если размер чтения не является , кратным 8 байтам.

+0

Но это может быть и не то же самое. Дайте мне знать, какую ошибку вы получаете, и я посмотрю, смогу ли я понять, почему. – ruthafjord

+0

Большое спасибо, похоже, сейчас работает. Я заметил, что у меня есть адреса с множеством завершающих нулей, которые имели смысл, но я не знал точно, это было просто наблюдение, на которое я не хотел слепо полагаться. еще раз спасибо – alex10791

Смежные вопросы