В Linux, использующем C ++ и GCC, возможно ли преобразовать виртуальный адрес в физический адрес? - PullRequest
2 голосов
/ 05 октября 2010

Могу ли я получить физический адрес для данного виртуального адреса в Linux, C ++ и GCC? Я знаю, что не смогу манипулировать физическим адресом как физическим адресом.

Ответы [ 4 ]

6 голосов
/ 05 октября 2010

Неа.Нет гарантии, что виртуальный адрес основан на физическом адресе (например, это может быть сопоставленный файл без представления в ОЗУ.) Кроме того, ОС может свободно перемещать виртуальные адреса в физической памяти в любое время, поэтомунет никакой гарантии, что физический адрес останется правильным или действительным.

Почему, по вашему мнению, вам нужен физический адрес?Что вы пытаетесь достичь?

3 голосов
/ 05 октября 2010

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

Или посмотрите на / proc / pid / maps

Я смотрю на http://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672325128

1 голос
/ 06 июня 2011

Я столкнулся с подобной проблемой и опубликовал ее вчера. В большинстве случаев каждый ответ говорит, что вы «не можете» сделать это, но по ссылке ниже это очень выполнимо. Оказывается, вы можете сделать это двумя способами: создать автономный инструмент-демон и контролировать / proc / $ pid / maps и / proc $ pid / pagemaps (это двоичный файл, содержащий адреса физических страниц) Перейдя по этой ссылке , вы можете посмотреть на их программу и, надеюсь, настроить ее для своих собственных целей. Или вы можете просто остановить свою программу и вызвать этот инструмент, чтобы прочитать текущую информацию в / proc. Надеюсь, это поможет.

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

1 голос
/ 05 октября 2010

Нет хорошего способа сделать это без того, чтобы ваш код работал внутри ядра, хотя вы могли бы сделать это, если ваша программа работает с правами root и вы можете прочитать /proc/kcore (и, возможно, /proc/kallsyms) и благодаря большой работе мы можем найти информацию о таблице страниц для вашего процесса и найти там адрес.

Проблема в том, что пока вы делаете это, ваша программа не останется на месте. Даже если страница, содержащая адрес, никогда не выгружается, ее можно переместить (на x86 некоторые страницы не могут быть использованы для DMA, поэтому страницу можно переместить только для настройки операции ввода-вывода, и я уверен, что Есть и другие причины, по которым страница может быть перемещена без замены).

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

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

...