Linux (Ubuntu), язык C: преобразование виртуальных адресов в физические - PullRequest
8 голосов
/ 06 июня 2011

Как видно из названия, у меня проблема с получением физического адреса из виртуального.

Позвольте мне объяснить: учитывая объявление переменной в пространстве процесса, как я могу получить ее физический адрес, сопоставленный с ОС?

Я наткнулся на некоторые системные вызовы /asm/io.h, где определена функция virt_to_phys(); Однако кажется, что этот заголовок устарел, и я не могу найти обходной путь.

Тем не менее, io.h доступно по адресу: /usr/src/linux-headers-2.6.35-28-generic/arch/x86/include/asm/. Мое текущее ядро ​​- 2.6.35-28, но io.h не включено в /usr/include/asm/?

Итак, еще раз: мне нужен способ получить физический адрес из виртуального. Предпочтительно выводится из приложения во время выполнения. Но даже обходной путь использования монитора /proc/PID/maps подойдет.

Любые идеи или комментарии будут с благодарностью.


EDIT После небольшого исследования этой темы я нашел кое-что, что помогает в этом отношении.

Оказывается, это более чем выполнимо, хотя и требует некоторого обходного пути. Вот ссылка на простое приложение, которое анализирует текущие отображенные страницы. Получается файл (бинарный файл) /proc/pid/pagemap (содержит физическое отображение виртуальных страниц). В любом случае код в этой ссылке можно изменить, чтобы он служил в качестве приложения для монитора или чего-то подобного.

Мне нужен был физический адрес для симуляции кэша.

Спасибо за помощь и ответы!

Ответы [ 3 ]

21 голосов
/ 06 июня 2011

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

В /proc/$pid/maps, у вас есть информация о том, что virtual адресует в вашей программеадресное пространство соответствует (mmapped файлы, куча, стек и т. д.).Это все, что вы получите.

Если вы работаете над кодом ядра (который, очевидно, не работает), вы можете узнать физический адрес, соответствующий странице памяти.Но даже тогда virt_to_phys не вся история;Я рекомендую прочитать Драйверы устройств Linux (особенно главы 8 и 15 ).

Заголовок asm/io.h - этозаголовок ядра.Он недоступен при компиляции пользовательского кода, потому что его содержимое просто не имеет смысла.Объявленные ею функции недоступны ни в одной библиотеке, только в ядре.

2 голосов
/ 19 декабря 2012

Как частично ответил оригинальный автор, ядро ​​Linux предоставляет свое сопоставление для пользовательского пространства через набор файлов в /proc.Документацию можно найти здесь .Краткое резюме:

  1. /proc/$pid/maps предоставляет список сопоставлений с их виртуальными адресами и соответствующий файл для сопоставленных файлов.
  2. /proc/$pid/pagemap предоставляет дополнительную информацию о каждой сопоставленной странице, включаяфизический адрес, если он существует.

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

1 голос
/ 24 ноября 2011

Передайте виртуальный адрес ядру с помощью systemcall / procfs и используйте vmalloc_to_pfn . Вернуть физический адрес через procfs / registers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...