когда происходит нечитаемая страница памяти? - PullRequest
1 голос
/ 02 марта 2011

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

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

Если вы правильно распределяете / освобождаете / обращаетесь к памяти, вы никогда этого не увидите.Вы столкнетесь с этим только тогда, когда сделаете что-то не так.

Как правило, malloc реализуется с помощью диспетчера перераспределения памяти.Если вы спросите malloc о 4 байтах памяти кучи, скажем, тогда менеджер памяти во время выполнения C выделит больший блок и затем выделит вам 4 байта в этом блоке.Последующие запросы на небольшие объемы памяти будут затем перераспределяться из одного из этих больших блоков.

Вы можете считывать и записывать в области этих больших блоков памяти, которые еще не были перераспределены malloc.Это, конечно, неопределенное поведение.Пожалуйста, не делай этого!Вы также можете читать и записывать в освобожденные субблоки, если больший блок не был возвращен в систему.Опять же, пожалуйста, не делайте этого.

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

3 голосов
/ 02 марта 2011

Всякий раз, когда программе не разрешено читать.

Это задача MMU разрешать или запрещать доступ к памяти. Это задача операционной системы, чтобы указать, какой программе разрешен доступ к какой зоне памяти.

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

На практике, если вы используете правильно выровненные только операции чтения, вам не о чем беспокоиться. На реальном оборудовании степень детализации доступа всегда находится на уровне страниц размером не менее 4 КБ. Математически, если указатель p лежит на допустимой странице, а p кратно некоторому значению выравнивания m, которое делит размер страницы n, тогда

(p+0)/n = (p+1)/n = ... = (p+m-1)/n

т.е. p, p+1, ..., p+m-1 все точки на одной странице.

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

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