Доступ за пределы памяти, выделенной программой. (Доступ к памяти другого приложения)

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

Заранее спасибо :)


person Auxiliary    schedule 11.04.2010    source источник
comment
Язык — это проблема. На этот вопрос нельзя ответить, не сообщив нам, какая операционная система и язык вас интересуют.   -  person bmargulies    schedule 11.04.2010


Ответы (3)


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

Сборщик мусора вызывается из среды выполнения. Среда выполнения «владеет» пространством памяти и позволяет другим приложениям «жить» в этом пространстве памяти. Вот почему может существовать сборщик мусора. Вам нужно будет создать среду выполнения, которой ОС выделяет память, чтобы среда выполнения выполняла приложение под своими полномочиями и также использовала GC под своими полномочиями. Вам нужно будет разрешить некоторые инструменты или API, которые позволяют разработчику приложения «запрашивать» память у вашей среды выполнения (а не у ОС), и у вашей среды выполнения есть способ не только ответить на такой запрос, но и отслеживать пространство памяти, которое оно выделение этому приложению. Вам, вероятно, понадобится фреймворк (набор DLL), который сделает эти вызовы доступными для приложения (разработчик будет использовать их для формирования запроса внутри своего приложения).

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

Надеюсь это поможет.

person Phillip    schedule 11.04.2010

No.

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

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

person John Saunders    schedule 11.04.2010
comment
... true, если вы не работаете в среде выполнения или CLR. - person Phillip; 11.04.2010
comment
@Philip: даже среда выполнения или CLR не могут получить доступ к адресному пространству другого процесса; по крайней мере, не без помощи операционной системы. Как правило, только операционная система может отображать физические адреса, принадлежащие виртуальному адресному пространству другого процесса, в ваш процесс. - person John Saunders; 11.04.2010
comment
Ну тут я с вами не согласен. Хотя я могу сказать, что для этого требуется связь между средой выполнения и операционной системой, среда выполнения обычно запрашивает пространство памяти от имени приложения. Поскольку среда выполнения вызывает создание, она по-прежнему связана с пространством памяти и может отслеживать и контролировать его. (обычно общий контроль с приложением). Но я также считаю, что это зависит от самой среды выполнения. Я никогда не имел дело со средами выполнения, которые работают так, как вы объясняете, но то, что я никогда их не видел, не означает, что их не существует. - person Phillip; 19.04.2010
comment
@Philip: я не верю, что основы виртуальной памяти изменились с тех пор, как я их изучил. Если физический адрес не отображается в виртуальном адресном пространстве процесса, процесс не может получить к нему доступ. Как правило, процесс не может изменять свое собственное виртуальное адресное пространство. Это может сделать только ОС, а не среда выполнения. - person John Saunders; 19.04.2010
comment
Я думаю, что меня неправильно поняли. Позвольте мне спросить об этом, потому что, возможно, мое понимание неверно. Если процесс запросил память у ОС, и ОС предоставляет процессу запрошенную память, и этот процесс разворачивается и запускает другой процесс, родителем которого он является, выделяет ли дочерний процесс память из ОС самостоятельно, или дает ли родительский процесс дочерней памяти из своего (родительского) собственного адресного пространства, которое ОС уже предоставила ему. Насколько я понимаю, процесс может предоставить дочернему процессу родительскую память из собственного пула. Я ошибся? - person Phillip; 19.04.2010
comment
@Philip: это будет зависеть от ОС. Это также не имеет ничего общего с размещением, и все, что связано с картами страниц. В классическом стиле unix fork and join дочерний процесс получает копии адресного пространства родительского процесса. Это будет копирование при записи, так что это будут только копии. Как только они будут написаны, общие страницы будут заменены их собственными частными копиями. - person John Saunders; 19.04.2010

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

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

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

person Dani    schedule 11.04.2010
comment
@Dani: в случае отладчика вы обнаружите, что он использует помощь ОС и высокие привилегии для доступа к другому адресному пространству. - person John Saunders; 11.04.2010
comment
В некоторых случаях отладчик работает через хост-процесс. хост-процесс порождает и приложение, и отладчик. Поскольку хост владеет пространством памяти, он предоставляет его как приложению, так и отладчику в качестве общего пространства, каждый из которых может манипулировать памятью по своему усмотрению (опять же, для этого требуется хост-процесс, что означает, что приложение не владеет пространством напрямую) - person Phillip; 19.04.2010