Зарезервированные адреса памяти? - PullRequest
3 голосов
/ 15 марта 2010

Существует ли список зарезервированных адресов памяти - список адресов, на которые никогда не может быть выделена память программы пользовательского пространства? Я понимаю, что это, скорее всего, для каждой ОС или для каждой архитектуры, но я надеялся, что кто-то знает некоторые из наиболее распространенных ОС и Arches. Я мог найти только одну версию для нескольких версий Windows:

для Windows NT, 2k и XP:

0x00000000 - 0x0000ffff -> нижняя страница защищена для упрощения отладки

0x00001000 - 0x7ffeffff -> область памяти для вашего приложения

0x7fff0000 - 0x7fffffff -> защищенная область, чтобы функции памяти не повредили следующую часть

0x80000000 - 0xffffffff -> память, в которой находится система, включая драйверы и т. Д.

Кто-нибудь знает о Linux или BSD (или о чем-нибудь еще)?

1 Ответ

1 голос
/ 15 марта 2010

Linux обычно настроен на владение ядром от 0xC000000 до 0xFFFFFFFF. Это можно изменить (например, печально известное разделение на 4 ГБ и 4 ГБ, которое не резервируется). glibc обычно загружается в 0xB000000.

В Linux 0x00000000 может быть запрошен определенным вызовом mmap (), если он не заблокирован системой безопасности (что оказалось плохой идеей для блокировки).

Относительно распределения NULL:

NULL выделяется только явно, поэтому я предполагаю, что программа, которая сделала это, была подготовлена ​​для этого. Для работы уязвимого кода GCC требуется не менее -fno-delete-null-pointer-checks. Мне сказали, что это подражает старому поведению BSD, которое отображало там нулевую страницу.

...