linux можно поделить на 3 уровня обстракции: hardware → kernel → processes
Kernel mode - режим работы программы ядра, позволяющее ему привелегии в виде полного доступа к УП и ОЗУ. Область памяти, доступ к которой может получить только ядро, называется пространством ядра (kernel space).
User mode - режим работы пользовательских процессов, не имеющих прямого доступа к оборудыванию. Пользовательский режим ограничен доступом к подмножеству памяти (обычно довольно небольшому) и безопасным операциям процессора. Пользовательское пространство - это части основной памяти, к которым могут получить доступ пользовательские процессы.
Ядро отвечает за управление задачами в четырех основных областях системы:
переключение контекста - это акт передачи одним процессом управления процессором другому процессу.
Ядро отвечает за переключение контекста.
Переключение контекста позволяет понять, когда именно запускается ядро. Суть заключается в том, что ядро запускается между временными квантами процесса во время переключения контекста.
Ядро должно управлять памятью во время переключения контекста, а это довольно сложная задача. Должны выполняться следующие условия:
Современные процессоры включают в себя блок управления памятью (memory management unit, MMU), который обеспечивает схему доступа к памяти, называемую виртуальной памятью.
Роль ядра в работе с устройствами относительно проста. Устройство обычно доступно только в режиме ядра, поскольку неправильный доступ (например, пользовательский процесс, запрашивающий отключение питания) может привести к сбою системы. Значительная проблема заключается в том, что различные устройства редко имеют один и тот же интерфейс программирования, даже если устройства выполняют одну и ту же задачу (например, две разные сетевые карты). Поэтому драйверы устройств традиционно являются частью ядра, и они стремятся представить единый интерфейс для пользовательских процессов, чтобы упростить работу разработчика программного обеспечения.
Существует несколько других функций ядра, доступных пользовательским процессам. К примеру, системные вызовы (system calls, syscalls) выполняют определенные задачи, которые сам по себе пользовательский процесс выполнить не может. Например, все действия по открытию, чтению и записи файлов связаны с системными вызовами.
Ядро поддерживает пользовательские процессы с функциями, отличными от традиционных системных вызовов, наиболее распространенными из которых являются псевдоустройства. Они выглядят как устройства для пользовательских процессов, но реализуются исключительно в программном обеспечении. Это означает, что технически их не должно быть в ядре, но обычно они там присутствуют из практической необходимости. Например, устройство генератора случайных чисел ядра (/dev/random) было бы трудно безопасно реализовать с помощью пользовательского процесса.
P.S Технически пользовательский процесс, который обращается к псевдоустройству, должен задействовать системный вызов, чтобы открыть устройство, поэтому процессы не могут полностью избежать применения системных вызовов.
Ядро Linux поддерживает традиционную концепцию пользователя Unix. Пользователь (user) — это сущность, которая может запускать процессы и владеть файлами.
Ядро не управляет именами пользователей, оно лишь идентифицирует пользователей с помощью простых числовых идентификаторов пользователей (user ID, UID).
Пользователи существуют в основном для поддержки прав и границ в системе. Каждый процесс пользовательского пространства имеет владельца (owner) и, как говорят, выполняется от его имени. Пользователь может прекратить свои процессы или изменить их поведение (в определенных пределах), но не может вмешиваться в процессы других пользователей. Кроме того, пользователи могут владеть файлами и выбирать, делиться ли ими с другими пользователями.
Помимо пользователей, ассоциируемых с реальными людьми, есть и т.н. системные пользователи, например пользователи-программы или суперпользователь (root), имеющий полный доступ (root access) к системе. Такой пользователь традиционно считается администратором системы.