2010-01-17 4 views
3

У меня есть программа. Я хочу, чтобы она смогла отобразить конкретную область памяти на разных прогонах.Как мне изменить область _particular_ в памяти?

  1. У меня есть исходный код программы. C/C++
  2. Я контролирую, как скомпилирована программа. gcc
  3. Я контролирую, как программа связана. gcc
  4. Я контролирую, как выполняется программа (Linux).

Я просто хочу иметь эту область памяти, скажу 0xabcdabcd, чтобы 0xdeadbeef, что я mmap для конкретного файла. Есть ли способ гарантировать это? (Я должен как-то убедиться, что другие вещи не загружены в этот конкретный регион).

EDIT:

Как сделать уверен, что ничего не принимает этот конкретный регион в памяти?

+0

Почему * конкретная * область в Память? В чем причина этого? – shylent

+0

См. Также: http://stackoverflow.com/questions/2084098/two-c-apps-sharing-a-read-only-region-of-memory-on-lnux. Ни в коем случае не дубликат, а тесно связанный. –

ответ

0

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

+2

Адресное пространство для каждого процесса, поэтому не имеет значения, что еще работает в системе. Важно то, что еще было сделано в текущем процессе, перед вызовом mmap(), который мог бы выделить что-то в этом регионе адресного пространства процесса. – Wyzard

+0

Да, конечно, вы правы.Я за внедренное пространство и сразу подумал «наметить конкретный физический регион» ... но вы, вероятно, правы. – e8johan

1

Проложить адрес на карте addr. Попытайтесь получить его на границе 8KB. Однако вы можете попробовать mlock().

7

Вы должны сделать две вещи:

  1. Укажите начальный адрес в качестве первого аргумента MMAP.
  2. Включите флаг MAP_FIXED.

Для начального адреса вам необходимо убедиться, что оно кратно количеству страниц. Чтобы получить размер страницы, используйте вызов sysconf(_SC_PAGESIZE) (это соответствующий вызов в Linux, другие платформы могут быть разными).

+2

Короче говоря, не зависеть от работы MAP_FIXED. Он может (и, следовательно, будет) терпеть неудачу. –

+0

@theatrus - на какой платформе вы ссылаетесь. В Linux addr интерпретируется только как подсказка, если MAP_FIXED не указан (http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html). –

+2

MAP_FIXED не гарантируется на успех - конечно, он будет информировать вас о невозможности сопоставления, но если ваша программа зависит от этого поведения, тогда будут проблемы :) –