Указатель на область памяти другого процесса - PullRequest
3 голосов
/ 19 января 2012

Я сталкивался с таким вопросом: «Если процесс A содержит указатель на переменную в процессе B, может ли A получить доступ и изменить эту переменную?»

Моя интуиция такова, поскольку процессА и В разные, им нельзя разрешать доступ к адресному пространству друг друга, так как это нарушит защиту.

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

(i).Когда мы говорим, что A имеет указатель на переменную V в B, содержит ли A виртуальный адрес (процесса B), соответствующий V, или физический адрес?

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

(ii).Если A содержит виртуальный адрес, поскольку возможно, что и A, и B могут иметь один и тот же виртуальный адрес, возможно, что таблица страниц A содержит отображение для виртуального адреса, который содержит A (который фактически является виртуальным адресом переменной V впроцесс Б).Затем, когда A пытается получить доступ и изменить этот виртуальный адрес, он изменяет что-то в своем собственном адресном пространстве (этот доступ будет разрешен, поскольку A обращается к своему собственному адресу).

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

Пожалуйста, отбросьте свои мысли.

Ответы [ 3 ]

5 голосов
/ 19 января 2012

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

Исключением является общая память: если оба процесса совместно используют область общей памяти, и оба процесса имеют права доступа для изменения области, то да, один процесс может изменять память другого процесса (но только в рамках этого процесса). область общей памяти).

IIRC, так работает на самом низком уровне: ядро ​​управляет списком областей памяти для каждого процесса. Эти регионы могут отображаться в физической памяти. Если регион не сопоставлен с физической памятью, и процесс пытается получить доступ к региону, ЦП сигнализирует ядру, чтобы сделать его доступным (например, путем загрузки его содержимого из файла / раздела подкачки). Если два процесса используют разделяемую память, для обоих процессов эти области будут отображаться в одно и то же физическое место в памяти (или в расположение файла подкачки). Возможно, вы захотите прочитать о MMU и виртуальной памяти .

0 голосов
/ 19 января 2012

В дополнение к тому, что все говорили: все современные операционные системы имеют механизмы для отладки, и для этого требуется один процесс (отладчик) для доступа к памяти другого (отладчик). Например, в Windows есть API ReadProcessMemory() / WriteProcessMemory(), но есть барьер привилегий для их использования.

Да, есть некоторый потенциал злоупотребления. Но как бы вы отлаживали в противном случае?

0 голосов
/ 19 января 2012

Ты совершенно прав. Так работает виртуальная память. Однако память может быть поделена между процессами.

Например, mmap в Linux может использоваться для создания общего сопоставления, которое позволит 2 отдельным процессам получать доступ к одной и той же памяти. Я не уверен, работает ли это путем сопоставления виртуальных адресов для двух процессов с одним и тем же фрагментом физической памяти по той же методике, что и операции ввода-вывода с отображением в памяти (страницы помечены как «грязные», за это отвечает операционная система для выполнения фактического ввода / вывода), но с точки зрения программиста, это точно, как если бы 2 потока обращались к этой памяти.

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