Какие значения хранятся в неиспользуемом пространстве памяти? - PullRequest
0 голосов
/ 02 марта 2019

Я использую mmap (), чтобы выделить 4096 длин памяти из / dev / zero, и я нахожу, что я все еще могу получить доступ к памяти из этого пространства (например, start_pt - указатель, который указывает на пространство, и я могу напечататьзначение * start_pt + 8192 без ошибок сегментации).И значения, хранящиеся в области вне пределов, кажутся случайными.

Кто-нибудь знает, что это за значения и почему я могу получить к ним доступ?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

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

0 голосов
/ 02 марта 2019

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

  • Когда ваша программа была запущена, загрузчик настроил память для вашего кода, постоянных данных, стека и многого другого.Кроме того, процесс, который создал новый процесс для вашей программы (возможно, оболочка командной строки), мог иметь некоторые вещи в памяти, которые сохраняются в процессе выполнения новой программы.(Например, я не уверен, являются ли аргументы командной строки непосредственно унаследованными от родителя или получены кодом запуска, получая их через некоторое межпроцессное взаимодействие.)
  • Хотя код запуска вашей программы былвыполняется (код, который запускается загрузчиком и который устанавливает среду C перед вызовом main), возможно, он запросил память для различных целей (подготовка файловых буферов, инициализация пула памяти для malloc и другие вещи), в том числе для собственных вычислений.
  • Если вы вызывали какие-либо подпрограммы до mmap, возможно, они запросили память.Например, буферы могут создаваться при открытии файлов, printf подготавливает некоторое рабочее пространство для операций форматирования, которые ему необходимо выполнить, а malloc требуется дополнительная память для хранения собственной записи, кроме того, что она возвращается к вам.

По сути, в памяти происходят разные вещи, кроме тех, которые вы наблюдаете в простом C-коде.

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