Современная компьютерная операционная система, как правило, выделяет виртуальную память в пространстве ядра и пользовательского пространства. В первую очередь, это разделение служит для обеспечения защиты памяти и защиты оборудования от злонамеренного или ошибочного поведения программного обеспечения.
Пространство ядра строго зарезервировано для запуска ядра привилегированной операционной системы, расширений ядра и большинства драйверов устройств. Напротив, пространство пользователя - это область памяти, в которой выполняется прикладное программное обеспечение и некоторые драйверы.
Термин пользовательские программы (или в пространстве пользователя) относится ко всему коду, который работает вне ядра операционной системы. Userland обычно относится к различным программам и библиотекам, которые операционная система использует для взаимодействия с ядром: программное обеспечение, которое выполняет ввод / вывод, управляет объектами файловой системы, прикладное программное обеспечение и т. Д.
Каждый процесс пользовательского пространства обычно выполняется в собственном пространстве виртуальной памяти и, если это явно не разрешено, не может получить доступ к памяти других процессов. Это основа защиты памяти в современных основных операционных системах и строительный блок для разделения привилегий. Отдельный пользовательский режим также может использоваться для создания эффективных виртуальных машин - см. Требования к виртуализации Попека и Голдберга. Обладая достаточными привилегиями, процессы могут запрашивать ядро для отображения части пространства памяти другого процесса на его собственное, как в случае с отладчиками. Программы также могут запрашивать совместно используемые области памяти с другими процессами, хотя доступны и другие методы для обеспечения межпроцессного взаимодействия.
Пользовательский режим | Пользовательские приложения | bash, LibreOffice, GIMP, Blender, 0 AD, Mozilla Firefox,... | ||||
---|---|---|---|---|---|---|
Системные компоненты | Демоны : Systemd, runit, udevd, polkitd, SSHD, Smbd. .. | Оконный менеджер : 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 целевых встроенные системы, бионические, написанные для Android и т.д. Все стремятся быть POSIX / SUS -Совместимы. | |||||
Режим ядра | Ядро Linux | stat , splice , dup , read , open , ioctl , write , mmap , close , exit И т.д. (около 380 системных вызовов) Ядро Linux Интерфейс системных вызовов (SCI, цели быть POSIX / SUS -Совместим) | ||||
Подсистема планирования процессов | Подсистема IPC | Подсистема управления памятью | Подсистема виртуальных файлов | Сетевая подсистема | ||
Другие компоненты: ALSA, DRI, evdev, LVM, устройство картографа, Linux Network Scheduler, Netfilter Модули безопасности Linux : SELinux, Tomoyo, AppArmor, Хлопайте | ||||||
Аппаратное обеспечение ( ЦП, основная память, устройства хранения данных и т. Д.) |
Наиболее распространенный способ реализации пользовательского режима отдельно от режима ядра - это кольца защиты операционной системы. Кольца защиты, в свою очередь, реализуются с использованием режимов ЦП. Обычно программы пространства ядра запускаются в режиме ядра, также называемом режимом супервизора ; обычные приложения в пользовательском пространстве запускаются в пользовательском режиме.
Многие операционные системы представляют собой операционные системы с единым адресным пространством - у них есть единое адресное пространство для всего кода пользовательского режима. (Код режима ядра может находиться в том же адресном пространстве или во втором адресном пространстве). Многие другие операционные системы имеют адресное пространство для каждого процесса, отдельное адресное пространство для каждого процесса в пользовательском режиме.
Другой подход, принятый в экспериментальных операционных системах, заключается в том, чтобы иметь единое адресное пространство для всего программного обеспечения и полагаться на семантику языка программирования, чтобы гарантировать невозможность доступа к произвольной памяти - приложения просто не могут получить какие-либо ссылки на объекты, которые им запрещены. доступ. Этот подход был реализован в JXOS, Unununium, а также в исследовательском проекте Microsoft Singularity.