Архитектура ОС UNIX - многоуровневая. На нижнем уровне, непосредственно над оборудованием, работает ядро операционной системы. Функции ядра доступны через интерфейс системных вызовов, образующих второй уровень. На следующем уровне работают командные интерпретаторы, команды и утилиты системного администрирования, коммуникационные драйверы и протоколы, - все то, что обычно относят к системному программному обеспечению. Наконец, внешний уровень образуют прикладные программы пользователя, сетевые и другие коммуникационные службы, СУБД и утилиты.
Основные функции ядра
Основные функции ядра UNIX (которое может быть монолитным или модульным) включают:
планирование и переключение процессов;
управление памятью;
обработку прерываний;
низкоуровневую поддержку устройств (через драйверы);
управление дисками и буферизация данных;
синхронизацию процессов и обеспечение средств межпроцессного взаимодействия (IPC).
Системные вызовы
Системные вызовы обеспечивают:
сопоставление действий пользователя с запросами драйверов устройств;
создание и прекращение процессов;
реализацию операций ввода-вывода;
доступ к файлам и дискам;
поддержку функций терминала.
Системные вызовы преобразуют процесс, работающий в режиме пользователя, в защищенный процесс, работающий в режиме ядра. Это позволяет процессу вызывать защищенные процедуры ядра для выполнения системных функций.
Системные вызовы обеспечивают программный интерфейс для доступа к процедурам ядра. Они обеспечивают управление системными ресурсами, такими как память, пространство на дисках и периферийные устройства. Системные вызовы оформлены в виде библиотеки времени выполнения. Многие системные вызовы доступны через командный интерпретатор.
Пользовательские процессы и процессы ядра
Пользовательские процессы образуют следующие два уровня и:
защищены от других пользовательских процессов;
не имеют доступа к процедурам ядра, кроме как через системные вызовы;
не могут непосредственно обращаться к пространству памяти ядра.
Пространство (памяти) ядра - это область памяти, в которой процессы ядра (процессы, работающие в контексте ядра) реализуют службы ядра. Любой процесс, выполняющийся в пространстве ядра, считается работающим в режиме ядра. Пространство ядра - привилегированная область; пользователь получает к ней доступ только через интерфейс системных вызовов. Пользовательский процесс не имеет прямого доступа ко всем инструкциям и физическим устройствам, - их имеет процесс ядра. Процесс ядра также может менять карту памяти, что необходимо для переключения процессов (смены контекста).
Пользовательский процесс работает в режиме ядра, когда начинает выполнять код ядра через системный вызов.
Обмен данными между пространством ядра и пользовательским пространством
Поскольку пользовательские процессы и ядро не имеют общего адресного пространства памяти, необходим механизм передачи данных между ними. При выполнении системного вызова, аргументы вызова и соответствующий идентификатор процедуры ядра передаются из пользовательского пространства в пространство ядра. Идентификатор процедуры ядра передается либо через аппаратный регистр процессора, либо через стек. Аргументы системного вызова передаются через пользовательскую область вызывающего процесса.
Пользовательская область процесса содержит информацию о процессе, необходимую ядру:
корневой и текущий каталоги, аргументы текущего системного вызова, размеры сегмента текста, данных и стека для процесса;
указатель на запись в таблице процессов, содержащую информацию для планировщика, например, приоритет;
таблицу дескрипторов файлов пользовательского процесса с информацией об открытых файлах;
стек ядра для процесса (пустой, если процесс работает в режиме пользователя).
Пользовательский процесс не может обращаться к пространству ядра, но ядро может обращаться к пространству процесса.
Системное программное обеспечение
ОС UNIX обеспечивает ряд стандартных системных программ для решения задач администрирования, переконфигурирования и поддержки файловой системы, в частности:
для настройки параметров конфигурации системы;
для перекомпоновки ядра (если она необходима) и добавления новых драйверов устройств;
для создания и удаления учетных записей пользователей;
создания и подключения физических файловых систем;
установки параметров контроля доступа к файлам.
Для решения этих задач системное ПО (работающее в пользовательском режиме) часто использует системные вызовы.