Вызов-ответ (аутентификация)
- 1 year ago
- 0
- 0
Систе́мный вы́зов ( англ. system call ) в программировании и вычислительной технике — обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции.
Современные операционные системы (ОС) предусматривают разделение времени между выполняющимися вычислительными процессами (многозадачность) и , препятствующее обращению исполняемых программ к данным других программ и оборудованию. Ядро ОС исполняется в привилегированном режиме работы процессора . Для выполнения межпроцессной операции или операции, требующей доступа к оборудованию, программа обращается к ядру, которое, в зависимости от полномочий вызывающего процесса, исполняет либо отказывает в исполнении такого вызова.
С точки зрения программиста, системный вызов обычно выглядит как вызов подпрограммы или функции из системной библиотеки . Однако системный вызов, как частный случай вызова такой функции или подпрограммы, следует отличать от более общего обращения к системной библиотеке, поскольку последнее может и не требовать выполнения привилегированных операций.
Архитектура современных процессоров предусматривает использование защищённого режима с несколькими уровнями привилегий: приложения обычно ограничены своим адресным пространством таким образом, что они не могут получить доступ или модифицировать другие приложения, исполняемые в операционной системе, либо саму операционную систему, и обычно не могут напрямую получать доступ к системным ресурсам (жёсткие диски, видеокарта, сетевые устройства и т. д.).
Для взаимодействия с системными ресурсами приложения используют системные вызовы, которые дают возможность операционной системе обеспечить безопасный доступ к ним. Системные вызовы передают управление ядру операционной системы, которое определяет, предоставлять ли приложению запрашиваемые ресурсы. Если ресурсы доступны, то ядро выполняет запрошенное действие, затем возвращает управление приложению.
В заголовочном файле ядра Linux sys/syscall.h доступна функция syscall , позволяющая непосредственно выполнять системные вызовы. Таблица системных вызовов Linux документирована и является частью API этой ОС.
В Windows NT интерфейс системных вызовов — это часть Native API в библиотеке ntdll.dll ; это недокументированный API, используемый реализациями обычного Windows API и напрямую используемый некоторыми системными приложениями Windows.
Как правило, система предоставляет библиотеку или API , которые находятся между обычным приложением и ОС. Такая библиотека предоставляет программисту удобный интерфейс для работы с ОС в виде интерфейсных функций. Интерфейсные функции библиотеки предоставляют обычные соглашения о вызове функций для использования системных вызовов и делают системные вызовы более унифицированными. Обращение к функции такой библиотеки само по себе не вызывает переключения в режим ядра и является обычным вызовом подпрограммы.
В
Unix
,
Unix-like
и других
POSIX
-совместимых операционных системах популярными системными вызовами являются:
,
,
,
,
,
,
fork
,
и
. Многие современные ОС имеют сотни системных вызовов. Например,
Linux
и
OpenBSD
, — каждый имеет около 380 разных вызовов
,
NetBSD
имеет около 500
,
FreeBSD
имеет более 500
, в то время как
Plan 9
имеет 51.
Инструменты, такие как , sysdig и , наблюдают за исполнением процесса с самого начала и выводят все системные вызовы этого процесса или могут присоединяться к уже работающему процессу и перехватывают все системные вызовы, сделанные этим процессом, если операции не нарушают пользовательские разрешения.
Реализация системных вызовов требует передачи управления, которая предполагает некоторые специфические для определённой архитектуры детали. Классический способ реализации — использование прерываний (interruption, trap). Прерывания передают управление ядру ОС, при этом приложению нужно внести в определённые регистры процессора номер системного вызова и необходимые аргументы и выполнить инструкцию генерации программного прерывания.
Для многих RISC -процессоров это единственный способ, но архитектуры группы CISC (в том числе, широко используемые x86 и x86 64 ) имеют дополнительные методы. Например, специальные инструкции SYSCALL/SYSRET или SYSENTER/SYSEXIT (эти два механизма были разработаны независимо друг от друга AMD и Intel соответственно, но, по сути, выполняют одинаковые функции). Это инструкции «быстрой» передачи управления, которые разработаны для передачи управления к ОС для системных вызовов без прерываний.
Системные вызовы могут быть сгруппированы в пять больших категорий:
в Unix-like,
NtCreateProcess
в Windows_NT
Native API
)
Системные вызовы в Unix-подобных системах обрабатываются в режиме ядра , которое завершается повышением режима выполнения процессора в более привилегированный, но изменение контекста процесса не требуется — однако при этом происходит изменение контекста привилегии. Системные ресурсы работают с учётом режима исполнения в соответствии со статусом регистра процессора и процессы — это своего рода абстракция, предоставляемая ОС. Системный вызов обычно не требует изменения контекста на другой процесс, напротив, он выполняется в контексте того процесса, который его вызвал.
В многопотоковых процессах системные вызовы могут исходить из разных потоков . Обработка таких системных вызовов полностью зависит от архитектуры ОС. Ниже приведены типичные модели, которые используются ядрами: