На платформе NT виртуальное адресное пространство 4 ГБ по умолчанию разделено на две части: нижние 2 ГБ для адресного пространства процесса и верхние 2 ГБ для использования системой.
Это адресное пространство является виртуальным и не зависит от объема оперативной памяти. Диспетчер памяти CPU и OS отображает части оперативной памяти в виртуальное адресное пространство по мере необходимости. Это очень сложно и не будет описано здесь. Это было дизайнерское решение, принятое в интересах производительности, безопасности и надежности.
Каждый процесс имеет свое собственное адресное пространство 2 ГБ, но есть только одно системное адресное пространство. Процессы изолированы в своем собственном частном адресном пространстве и не могут даже видеть других. При необходимости предусмотрена возможность обмена адресами между двумя или более процессами. Системное адресное пространство запрещено обычными процессами и доступно только компонентам уровня ядра, таким как сама ОС и драйверы устройств. Если процесс сбивается с пути, он может только навредить себе; другие процессы и ОС не затрагиваются.
Но почему бы не дать системе собственное частное адресное пространство, как для процессов? Это позволило бы выделить 4 ГБ адресного пространства для системы и каждого процесса. Это можно было сделать - но была проблема.
Предположим, что было сделано. Запущенный процесс будет иметь полный доступ к своему коду и данным, и все будет хорошо. Но что, если этот процесс делает вызов ОС, который требует доступа к системному адресному пространству, например, для операции ввода-вывода? Или что произойдет, если ядро обработает прерывание?
Только адресное пространство запущенного процесса может быть замечено ЦП. Что делать? Решение состоит в том, чтобы сделать переключение контекста, которое отображает системное адресное пространство. ОС может сделать это довольно эффективно, но на это нужно время. Если бы к системному адресному пространству требовался частый доступ, накладные расходы на переключение контекста стали бы чрезмерными и производительность снизилась бы.
Должен быть лучший способ.
Было принято решение разделить общее адресное пространство 4 ГБ на две части по 2 ГБ каждая. Обработайте адресное пространство в нижних 2 ГБ и систему в верхних. Это позволяет системному адресному пространству всегда находиться в области видимости и быть доступным в любое время без переключения контекста. Как это часто бывает, дизайнерские решения принимаются по практическим соображениям.
2 ГБ сейчас могут показаться очень маленькими и ограниченными, но они были огромны, когда NT была выпущена в 1993 году. И не забывайте, что у каждого процесса есть свои 2 ГБ.