Означает ли использование нулевых указателей, что некоторая память всегда не используется? - PullRequest
1 голос
/ 08 сентября 2011

В C / C ++ мы привыкли проверять нулевые указатели перед разыменованием их, например,

int *p = malloc(sizeof(int));
if (p != 0)
{
    /* Do something with the pointer */
}

Следовательно, диспетчер памяти никогда не может вернуть указатель на первый адрес памяти (где p == 0)поскольку вызывающая программа будет предполагать, что память не может быть выделена.

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

Ответы [ 3 ]

4 голосов
/ 08 сентября 2011

Прежде всего, чтобы было понятно, malloc возврат 0 означает сигнал об ошибке.

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

ОС просто не должна ничего сопоставлять по физическому адресу 0 для обычного процесса , и этот адрес всегда будет недействительным, если процесс попытается получить к нему доступ. Сама ОС, для собственного удобства, может получить доступ к памяти по адресу 0, если она того пожелает.

2 голосов
/ 08 сентября 2011

Да, вроде. Технически вы могли бы хранить что-либо по нулевому адресу, но Windows не позволяет - вы получаете нарушение доступа, а Linux не позволяет - вы получаете ошибку сегментации. Это помогает в назначении специального значения, которое будет означать «нулевой указатель - указатель, который явно не указывает ни на один живой объект». Возможно, существуют системы, в которых хранение данных по нулевому адресу разрешено напрямую, но все же им потребуется какое-то специальное значение для «нулевого указателя».

1 голос
/ 08 сентября 2011

В большинстве систем что-то уже есть по физическому адресу 0. Некоторые старые процессоры просто начинают выполнение там, когда выходят из перезагрузки.Другие могут ожидать таблицу векторов (адреса для сброса и прерываний).Часто ПЗУ будет отображаться там, чтобы содержать особые вещи, ожидаемые процессором, поэтому нет смысла когда-либо получать указатель там.

С виртуальной памятью ваше приложение и все его выделения живут впространство виртуальной памяти, которое отображается на физическую память.Я предполагаю, что программа отображается по виртуальному адресу 0, и поэтому вы все равно не ожидаете, что malloc вернет 0. Это скорее предположение с моей стороны, так как я не очень хорошо знаком с деталями виртуальной памяти.layout.

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

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