Системный вызов
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Linux_kernel_interfaces.svg/300px-Linux_kernel_interfaces.svg.png)
Систе́мный вы́зов (
Современные операционные системы (ОС) предусматривают
С точки зрения программиста, системный вызов обычно выглядит как вызов
Привилегии
Архитектура современных процессоров предусматривает использование защищённого режима с несколькими уровнями привилегий: приложения обычно ограничены своим адресным пространством таким образом, что они не могут получить доступ или модифицировать другие приложения, исполняемые в операционной системе, либо саму операционную систему, и обычно не могут напрямую получать доступ к системным ресурсам (жёсткие диски, видеокарта, сетевые устройства и т. д.).
Для взаимодействия с системными ресурсами приложения используют системные вызовы, которые дают возможность операционной системе обеспечить безопасный доступ к ним. Системные вызовы передают управление ядру операционной системы, которое определяет, предоставлять ли приложению запрашиваемые ресурсы. Если ресурсы доступны, то ядро выполняет запрошенное действие, затем возвращает управление приложению.
Интерфейс системных вызовов
В заголовочном файле ядра Linux sys/syscall.h доступна функция syscall, позволяющая непосредственно выполнять системные вызовы. Таблица системных вызовов Linux документирована и является частью API этой ОС.
В Windows NT интерфейс системных вызовов — это часть Native API в библиотеке ntdll.dll; это недокументированный API, используемый реализациями обычного Windows API и напрямую используемый некоторыми системными приложениями Windows.
Промежуточная библиотека
Как правило, система предоставляет библиотеку или API, которые находятся между обычным приложением и ОС. Такая библиотека предоставляет программисту удобный интерфейс для работы с ОС в виде интерфейсных функций. Интерфейсные функции библиотеки предоставляют обычные соглашения о вызове функций для использования системных вызовов и делают системные вызовы более унифицированными. Обращение к функции такой библиотеки само по себе не вызывает переключения в режим ядра и является обычным вызовом подпрограммы.
Примеры и инструменты
В
Инструменты, такие как strace, sysdig и truss, наблюдают за исполнением процесса с самого начала и выводят все системные вызовы этого процесса или могут присоединяться к уже работающему процессу и перехватывают все системные вызовы, сделанные этим процессом, если операции не нарушают пользовательские разрешения.
Типичные реализации
Реализация системных вызовов требует передачи управления, которая предполагает некоторые специфические для определённой архитектуры детали. Классический способ реализации — использование прерываний (interruption, trap). Прерывания передают управление ядру ОС, при этом приложению нужно внести в определённые регистры процессора номер системного вызова и необходимые аргументы и выполнить инструкцию генерации программного прерывания.
Для многих
Категории системных вызовов
Системные вызовы могут быть сгруппированы в пять больших категорий:
- Управление процессами
- Работа с файлами
- 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, macOS, iOS, а также Windows и Solaris последних версий.
- Модель многие-к-многим: в этой модели во время системного вызова множество пользовательских потоков увязывается с множеством потоков уровня ядра.
- Гибридная модель: в этой модели реализованы модели «многие-к-многим» и «один-к-одному» в зависимости от выбора ядра ОС.
Примечания
- ↑ syscalls(2) - Linux manual page . Дата обращения: 10 апреля 2015. Архивировано 15 января 2020 года.
- ↑ OpenBSD. System call names (kern/syscalls.c) . BSD Cross Reference (14 сентября 2013). Дата обращения: 10 апреля 2015. Архивировано 3 декабря 2014 года.
- ↑ NetBSD. System call names (kern/syscalls.c) . BSD Cross Reference (17 октября 2013). Дата обращения: 10 апреля 2015. Архивировано 2 февраля 2015 года.
- ↑ FreeBSD syscalls.c, the list of syscall names and IDs . Дата обращения: 10 апреля 2015. Архивировано 30 мая 2013 года.
- ↑ Plan 9 sys.h, the list of syscall names and IDs . Дата обращения: 10 апреля 2015. Архивировано 16 февраля 2015 года.
Ссылки
- [1]Kernel command using Linux system calls IBM Developer Works(англ.)
Для улучшения этой статьи желательно:
|