Нужна полная картина виртуального адресного пространства - PullRequest
0 голосов
/ 08 июня 2010

Это изображение дает хорошее представление о виртуальном адресном пространстве. Но это говорит только половину истории. Это дает только полную картину адресного пространства пользователя, т. Е. Ниже 50% (или в некоторых случаях 75%).

А как насчет остальных 50% (или 25%), которое занято ядром. Я знаю, что в ядре также много разных вещей, таких как модули ядра, драйверы устройств, само ядро ​​ядра. Должна быть какая-то раскладка, верно?

Каков его макет? Если вы говорите, что его операционная система зависит. Я бы сказал, что есть две основные операционные системы Windows и Linux. Пожалуйста, дайте ответ для любого из них.

альтернативный текст http://img690.imageshack.us/img690/2543/virtualadressspace.gif

Ответы [ 4 ]

2 голосов
/ 08 июня 2010

У меня для вас еще более плохие новости, есть также возможность явно рандомизировать макеты адресов ядра ОС как функцию безопасности. Это включено по умолчанию в самой последней Windows, OpenBSD, а также является опцией для Linux.

1 голос
/ 08 июня 2010

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

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

0 голосов
/ 04 августа 2010
0 голосов
/ 08 июня 2010

Это не совсем ясно из вашего вопроса или изображения, но под «Системным адресным пространством» вы, вероятно, подразумеваете область между 2ГБ-4ГБ.Это действительно занимает половину теоретического пространства 4 ГБ, но для этого есть веская причина.

Обычно с 32-битами вы можете адресовать 4 ГБ памяти (2 ^ 32 = 4294967296), поэтому это будет выглядеть логичноиметь 4 ГБ адресного пространства, а не 2 ГБ.Причина этого заключается в следующем: Предположим, у вас есть 2 указателя, например, в C / C ++:

char *ptr1;
char *ptr2;

Теперь я хочу узнать, в чем разница между двумя указателями, например:

offset = ptr2 - ptr1;

Каким должен быть тип данных «смещение»?Если мы не знаем, стоит ли ptr1 перед ptr2 или наоборот, смещение может быть положительным или отрицательным.Теперь, если оба значения ptr1 или ptr2 находятся в диапазоне от 0 до 2 ГБ, тогда смещение всегда находится в диапазоне от -2147483648 до +2147483647, что точно соответствует 4-байтовому целому числу со знаком.

Однако, если бы ptr1 и ptr2 были бывозможность доступа к полному адресному пространству 4 ГБ, смещение будет между -4294967296 и +4294967295, которое больше не вписывается в 4-байтовое целое число со знаком.

Если вы уверены, что никогда не выполняете такого родавычисления в вашем приложении, или вы уверены, что если вы вычли 2 указателя, что они никогда не будут больше, чем 2 ГБ (или ваши векторы всегда меньше 2 ГБ), вы можете сказать компоновщику (Windows, Visual Studio), что вашПриложение LARGEADDRESSAWARE.Этот флаг компоновщика устанавливает бит в исполняемом файле, и если 32-битная Windows загружается правильно (в XP вы должны были загружаться с флагом / 3GB), Windows предоставила вам 3 ГБ вместо 2 ГБ (только для исполняемых файлов LARGEADDRESSAWARE).Оставшиеся 1 ГБ все еще используются для структур данных операционной системы (но у меня нет подробностей о них).

Если вы используете 64-разрядную версию Windows, то все становится еще интереснее, потому что исполняемые файлы LARGEADDRESSAWARE получат4 ГБ памяти.По-видимому, структуры данных операционной системы теперь хранятся где-то в 64-битном адресном пространстве, за пределами 4 ГБ, используемых приложением.

Надеюсь, это немного прояснит.

...