2014-11-14 4 views
1

простой вопрос:Доступ к оперативной памяти напрямую

Возможно ли, и как это возможно, получить виртуальную память моей программы напрямую?

Чтобы быть конкретным, вместо ввода

int someValue = 5; 

я могу сделать что-то вроде этого:

VirtualMemory[0x0] = (int)5; 

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

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

Спасибо за все ваши ответы.

Приветствия,

Лаки

+0

Просто поместите значения в массив, который всегда непрерывный в памяти, что с ним связано виртуальная память? – dtech

+1

Что такое ОС/платформа? Ваша программа уже запущена в виртуальной памяти в Windows/unix. Если вы хотите сохранить значения «рядом друг с другом», просто используйте массив или кусок памяти из malloc() – OldProgrammer

+0

. Хорошие советы –

ответ

1

Не совсем, потому что в исходном коде вы не знаете, какая память адрес вашей программы будет «загружен в». Таким образом, все адреса памяти в программе закодированы в стиле «смещение от начала программы».

Часть ответственности «загрузчика процесса» при копировании программы в память состоит в том, чтобы добавить «базовый указатель смещения» ко всем другим смещениям, поэтому все «имена», описывающие адреса памяти, будут ссылаться на фактические адреса памяти вместо «смещения с начала программы».

Это вообще хорошо, как если бы они были закодированы напрямую, две программы, которые нуждались в одном и том же наборе адресов, не могли быть запущены одновременно, не повредив общую память друг друга. Кроме того, загрузка программы в другой начальный адрес будет невозможна, так как ходьба за пределами памяти вашей программы (почти гарантированная, если вы переместите программу без перезаписи ссылок на адрес памяти) приведет к повышению segfault в операционной системе мониторы управления памятью.

Также вам нужно указать имя для начала, а это означает, что смещения привязаны к именам переменных. Как правило, намного легче делать рыбу в куче, основанную на элементе alloc'd, чем по-настоящему находить начало программы, загруженной в память (поскольку язык программирования C на самом деле не фиксирует этот адрес в -язычное имя переменной, а макет зависит от системы).

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