Современная компьютерная операционная система обычно использует виртуальную память для предоставления отдельных адресных пространств или отдельных областей единого адресного пространства, называемых пространством пользователя и пространством ядра . [1] [a] В первую очередь, это разделение служит для обеспечения защиты памяти и аппаратной защиты от вредоносного или ошибочного поведения программного обеспечения.
Пространство ядра строго зарезервировано для запуска ядра привилегированной операционной системы , расширений ядра и большинства драйверов устройств . Напротив, пространство пользователя — это область памяти, где выполняется прикладное программное обеспечение и некоторые драйверы, обычно одно адресное пространство на процесс.
Термин «пространство пользователя» (или «пользовательская среда» ) относится ко всему коду, который выполняется вне ядра операционной системы. [2] Под пространством пользователя обычно подразумеваются различные программы и библиотеки , которые операционная система использует для взаимодействия с ядром: программное обеспечение, которое выполняет ввод/вывод , манипулирует объектами файловой системы , прикладное программное обеспечение и т. д.
Каждый процесс пользовательского пространства обычно выполняется в своем собственном пространстве виртуальной памяти и, если явно не разрешено, не может получить доступ к памяти других процессов. Это основа защиты памяти в современных основных операционных системах и строительный блок для разделения привилегий . Отдельный пользовательский режим также может использоваться для создания эффективных виртуальных машин – см. требования к виртуализации Попека и Голдберга . При наличии достаточных привилегий процессы могут запрашивать ядро для отображения части пространства памяти другого процесса на свое собственное, как в случае отладчиков . Программы также могут запрашивать общие области памяти с другими процессами, хотя доступны и другие методы для обеспечения межпроцессного взаимодействия .
Пользовательский режим | Пользовательские приложения | bash , LibreOffice , GIMP , Blender , 0 AD , Mozilla Firefox , ... | ||||
---|---|---|---|---|---|---|
Компоненты системы | init-демон : OpenRC , runit , systemd ... | Системные демоны : polkitd , smbd , sshd , udevd ... | Оконный менеджер : X11 , Wayland , SurfaceFlinger (Android) | Графика : Mesa , AMD Catalyst , ... | Другие библиотеки: GTK , Qt , EFL , SDL , SFML , FLTK , GNUstep , ... | |
Стандартная библиотека C | fopen , execv , malloc , memcpy , localtime , pthread_create ... (до 2000 подпрограмм ) glibc стремится быть быстрым, musl стремится быть легким, uClibc нацелен на встраиваемые системы, bionic был написан для Android и т. д. Все стремятся быть совместимыми с POSIX / SUS . | |||||
Режим ядра | ядро Linux | stat , splice , dup , read , open , ioctl , write , mmap , close , exit , и т. д. (около 380 системных вызовов) Интерфейс системных вызововядра Linux (SCI) стремится быть совместимым с POSIX / SUS [3] | ||||
Подсистема планирования процессов | Подсистема МПК | Подсистема управления памятью | Подсистема виртуальных файлов | Сетевая подсистема | ||
Другие компоненты: ALSA , DRI , evdev , klibc , LVM , device mapper , Linux Network Scheduler , Netfilter Модули безопасности Linux : SELinux , TOMOYO , AppArmor , Smack | ||||||
Аппаратное обеспечение ( ЦП , оперативная память , устройства хранения данных и т. д.) |
Наиболее распространенный способ реализации пользовательского режима отдельно от режима ядра включает кольца защиты операционной системы . Кольца защиты, в свою очередь, реализуются с использованием режимов ЦП . Обычно программы пространства ядра работают в режиме ядра , также называемом режимом супервизора ; обычные приложения в пространстве пользователя работают в пользовательском режиме.
Некоторые операционные системы являются операционными системами с одним адресным пространством — они имеют одно адресное пространство для всего кода пользовательского режима. (Код режима ядра может находиться в том же адресном пространстве или во втором адресном пространстве). Другие операционные системы имеют адресное пространство для каждого процесса с отдельным адресным пространством для каждого процесса пользовательского режима.
Другой подход, используемый в экспериментальных операционных системах, заключается в наличии единого адресного пространства для всего программного обеспечения и использовании семантики языка программирования для обеспечения невозможности доступа к произвольной памяти — приложения не могут получать ссылки на объекты, к которым им не разрешен доступ. [4] [5] Этот подход был реализован в JXOS , Unununium, а также в исследовательском проекте Microsoft Singularity .