Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ядро ОС.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
874 Кб
Скачать
☆

Типичные имплементации

Имплементация системных вызовов требует передачу управления, которая предполагает некоторые специфические для определенной архитектуры детали. Классический способ имплементации - использование прерываний (interruption, trap). Прерывания передают управление ядру ОС, при этом приложению нужно внести в определенные регистры процессора номер системного вызова и необходимые аргументы и выполнить инструкцию генерации программного прерывания.

Для многих RISC-процессоров это единственный способ, но архитектуры группы CISC (в том числе, широко используемые x86 и x86 64) имеет дополнительные методы. Например, специальные инструкции SYSCALL/SYSRET или SYSENTER/SYSEXIT (эти два механизма были разработаны независимо друг от друга AMD и Intel соответственно, но, по сути, выполняют одинаковые функции). Это инструкции "быстрой" передачи управления, которые разработаны для передачи управления к ОС для системных вызовов без прерываний.

Категории системных вызовов

Системные вызовы могут быть сгруппированы в пять больших категорий:

  1. Управление процессами

    • load

    • execute

    • end (exit), abort

    • создание процесса (fork в Unix-like, NtCreateProcess в Windows_NT Native API)

    • завершение процесса

    • get/set process attributes

    • wait время, события, signal события

    • allocate, free memory

  2. Работа с файлами

    • create file, delete file

    • open, close

    • read, write, reposition

    • get/set file attributes

  3. Управление устройствами

    • request device, release device

    • read, write, reposition

    • get/set device attributes

    • logically attach or detach devices

  4. Работа с информацией

    • get/set time or date

    • get/set system data

    • get/set process, file, or device attributes

  5. Связь, коммуникация

    • create, delete communication connection

    • send, receive messages

    • transfer status information

    • attach or detach remote devices

Режим процессора и переключение контекста

Системные вызовы в Unix-подобных системах обрабатываются в режиме ядра, которое завершается повышением режима выполнения процессора в более привилегированный, но изменение контекста процесса не требуется - однако при этом происходит изменение контекста привилегии. Системные ресурсы работают с учетом режима исполнения в соответствии с статусом регистра процессора и процессы - это своего рода абстракция, предоставляемая ОС. Системный вызов обычно не требует изменение контекста на другой процесс, напротив, он выполняется в контексте того процесса, который его вызвал.

В многопотоковых процессах системные вызовы могут исходить из разных потоков. Обработка таких системных вызовов полностью зависит от архитектуры ОС. Ниже приведена типичные модели, которые используются ядрами:

  • Модель многие-к-одному: все системные вызовы от любого пользовательского потока в процессе обрабатываются одним потоком уровня ядра. У этой системы есть один серьезный недостаток - любой блокирующий системный вызов (например, ожидание ввода пользователя) может остановить остальные потоки. Также эта модель не может использовать многоядерные процессоры.

  • Модель один-к-одному: Каждый поток пользователя во время системного вызова присоединяется к своему собственному потоку. Эта модель решает проблему блокирования системных вызовов. она применяется в большинстве дистрибутивов Linux, Windows, Solaris последних версий.

  • Модель многие-к-многим: В этой модели во время системного вызова множество пользовательских потоков увязываются с множеством потоков уровня ядра.

  • Гибридная модель: В этой модели имплементированы модели "многие-к-многим" и "один-к-одному" в зависимости от выбора ядра ОС.