Современная компьютерная операционная система обычно использует виртуальную память для предоставления отдельных адресных пространств или отдельных областей единого адресного пространства, называемых пространством пользователя и пространством ядра . [1] [a] В первую очередь, это разделение служит для обеспечения защиты памяти и аппаратной защиты от вредоносного или ошибочного поведения программного обеспечения.
Пространство ядра строго зарезервировано для запуска ядра привилегированной операционной системы , расширений ядра и большинства драйверов устройств . Напротив, пространство пользователя — это область памяти, где выполняется прикладное программное обеспечение и некоторые драйверы, обычно одно адресное пространство на процесс.
Термин «пространство пользователя» (или «пользовательская среда» ) относится ко всему коду, который выполняется вне ядра операционной системы. [2] Под пространством пользователя обычно подразумеваются различные программы и библиотеки , которые операционная система использует для взаимодействия с ядром: программное обеспечение, которое выполняет ввод/вывод , манипулирует объектами файловой системы , прикладное программное обеспечение и т. д.
Каждый процесс пользовательского пространства обычно выполняется в своем собственном пространстве виртуальной памяти и, если явно не разрешено, не может получить доступ к памяти других процессов. Это основа защиты памяти в современных основных операционных системах и строительный блок для разделения привилегий . Отдельный пользовательский режим также может использоваться для создания эффективных виртуальных машин – см. требования к виртуализации Попека и Голдберга . При наличии достаточных привилегий процессы могут запрашивать ядро для отображения части пространства памяти другого процесса на свое собственное, как в случае отладчиков . Программы также могут запрашивать общие области памяти с другими процессами, хотя доступны и другие методы для обеспечения межпроцессного взаимодействия .
Наиболее распространенный способ реализации пользовательского режима отдельно от режима ядра включает кольца защиты операционной системы . Кольца защиты, в свою очередь, реализуются с использованием режимов ЦП . Обычно программы пространства ядра работают в режиме ядра , также называемом режимом супервизора ; обычные приложения в пространстве пользователя работают в пользовательском режиме.
Некоторые операционные системы являются операционными системами с одним адресным пространством — они имеют одно адресное пространство для всего кода пользовательского режима. (Код режима ядра может находиться в том же адресном пространстве или во втором адресном пространстве). Другие операционные системы имеют адресное пространство для каждого процесса с отдельным адресным пространством для каждого процесса пользовательского режима.
Другой подход, используемый в экспериментальных операционных системах, заключается в наличии единого адресного пространства для всего программного обеспечения и использовании семантики языка программирования для обеспечения невозможности доступа к произвольной памяти — приложения не могут получать ссылки на объекты, к которым им не разрешен доступ. [4] [5] Этот подход был реализован в JXOS , Unununium, а также в исследовательском проекте Microsoft Singularity .