- •Типы архитектур ядер операционных систем Монолитное ядро
- •Подгружаемые модули
- •Модульное ядро
- •Микроядро
- •Архитектура микроядра, основанная на программах-серверах, работающих в пользовательском режиме
- •Устройство
- •Достоинства и недостатки
- •Поколения
- •История
- •Экзоядро
- •Наноядро
- •Пикоядро
- •Гибридное ядро
- •Примеры
- •Комбинация разных подходов
- •Загружаемый модуль ядра
- •Преимущества
- •Вопросы лицензирования
- •Дело Linuxant
- •Бинарная совместимость
- •Безопасность
- •Основные принципы функционирования
- •Наиболее известные представители данного класса по
- •Идеология построения драйверов
- •Сегментирование памяти
- •Условия и принцип защиты
- •Взаимодействие уровней привилегий
- •Переключение стека
- •Страничная память
- •Механизм ключей защиты
- •Симуляция сегментации Адресация основанная на Capability
- •Режим супервизора
- •Режим гипервизора
- •Режим системного управления (smm)
- •Модель взаимодействия между цп и уровнями абстракции ос
- •Системный вызов
- •Привилегии
- •Интерфейс системных вызовов
- •Промежуточная библиотека
- •Примеры и инструменты
- •Типичные имплементации
- •Категории системных вызовов
- •Режим процессора и переключение контекста
Типичные имплементации
Имплементация системных вызовов требует передачу управления, которая предполагает некоторые специфические для определенной архитектуры детали. Классический способ имплементации - использование прерываний (interruption, trap). Прерывания передают управление ядру ОС, при этом приложению нужно внести в определенные регистры процессора номер системного вызова и необходимые аргументы и выполнить инструкцию генерации программного прерывания.
Для многих RISC-процессоров это единственный способ, но архитектуры группы CISC (в том числе, широко используемые x86 и x86 64) имеет дополнительные методы. Например, специальные инструкции SYSCALL/SYSRET или SYSENTER/SYSEXIT (эти два механизма были разработаны независимо друг от друга AMD и Intel соответственно, но, по сути, выполняют одинаковые функции). Это инструкции "быстрой" передачи управления, которые разработаны для передачи управления к ОС для системных вызовов без прерываний.
Категории системных вызовов
Системные вызовы могут быть сгруппированы в пять больших категорий:
Управление процессами
load
execute
end (exit), abort
создание процесса (fork в Unix-like, NtCreateProcess в Windows_NT Native API)
завершение процесса
get/set process attributes
wait время, события, signal события
allocate, free memory
Работа с файлами
create file, delete file
open, close
read, write, reposition
get/set file attributes
Управление устройствами
request device, release device
read, write, reposition
get/set device attributes
logically attach or detach devices
Работа с информацией
get/set time or date
get/set system data
get/set process, file, or device attributes
Связь, коммуникация
create, delete communication connection
send, receive messages
transfer status information
attach or detach remote devices
Режим процессора и переключение контекста
Системные вызовы в Unix-подобных системах обрабатываются в режиме ядра, которое завершается повышением режима выполнения процессора в более привилегированный, но изменение контекста процесса не требуется - однако при этом происходит изменение контекста привилегии. Системные ресурсы работают с учетом режима исполнения в соответствии с статусом регистра процессора и процессы - это своего рода абстракция, предоставляемая ОС. Системный вызов обычно не требует изменение контекста на другой процесс, напротив, он выполняется в контексте того процесса, который его вызвал.
В многопотоковых процессах системные вызовы могут исходить из разных потоков. Обработка таких системных вызовов полностью зависит от архитектуры ОС. Ниже приведена типичные модели, которые используются ядрами:
Модель многие-к-одному: все системные вызовы от любого пользовательского потока в процессе обрабатываются одним потоком уровня ядра. У этой системы есть один серьезный недостаток - любой блокирующий системный вызов (например, ожидание ввода пользователя) может остановить остальные потоки. Также эта модель не может использовать многоядерные процессоры.
Модель один-к-одному: Каждый поток пользователя во время системного вызова присоединяется к своему собственному потоку. Эта модель решает проблему блокирования системных вызовов. она применяется в большинстве дистрибутивов Linux, Windows, Solaris последних версий.
Модель многие-к-многим: В этой модели во время системного вызова множество пользовательских потоков увязываются с множеством потоков уровня ядра.
Гибридная модель: В этой модели имплементированы модели "многие-к-многим" и "один-к-одному" в зависимости от выбора ядра ОС.
