Loading AI tools
Из Википедии, свободной энциклопедии
Систе́мный вы́зов (англ. system call) в программировании и вычислительной технике — обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции.
Современные операционные системы (ОС) предусматривают разделение времени между выполняющимися вычислительными процессами (многозадачность) и разделение полномочий, препятствующее обращению исполняемых программ к данным других программ и оборудованию. Ядро ОС исполняется в привилегированном режиме работы процессора. Для выполнения межпроцессной операции или операции, требующей доступа к оборудованию, программа обращается к ядру, которое, в зависимости от полномочий вызывающего процесса, исполняет либо отказывает в исполнении такого вызова.
С точки зрения программиста, системный вызов обычно выглядит как вызов подпрограммы или функции из системной библиотеки. Однако системный вызов, как частный случай вызова такой функции или подпрограммы, следует отличать от более общего обращения к системной библиотеке, поскольку последнее может и не требовать выполнения привилегированных операций.
Архитектура современных процессоров предусматривает использование защищённого режима с несколькими уровнями привилегий: приложения обычно ограничены своим адресным пространством таким образом, что они не могут получить доступ или модифицировать другие приложения, исполняемые в операционной системе, либо саму операционную систему, и обычно не могут напрямую получать доступ к системным ресурсам (жёсткие диски, видеокарта, сетевые устройства и т. д.).
Для взаимодействия с системными ресурсами приложения используют системные вызовы, которые дают возможность операционной системе обеспечить безопасный доступ к ним. Системные вызовы передают управление ядру операционной системы, которое определяет, предоставлять ли приложению запрашиваемые ресурсы. Если ресурсы доступны, то ядро выполняет запрошенное действие, затем возвращает управление приложению.
В заголовочном файле ядра Linux sys/syscall.h доступна функция syscall, позволяющая непосредственно выполнять системные вызовы. Таблица системных вызовов Linux документирована и является частью API этой ОС.
В Windows NT интерфейс системных вызовов — это часть Native API в библиотеке ntdll.dll; это недокументированный API, используемый реализациями обычного Windows API и напрямую используемый некоторыми системными приложениями Windows.
Как правило, система предоставляет библиотеку или API, которые находятся между обычным приложением и ОС. Такая библиотека предоставляет программисту удобный интерфейс для работы с ОС в виде интерфейсных функций. Интерфейсные функции библиотеки предоставляют обычные соглашения о вызове функций для использования системных вызовов и делают системные вызовы более унифицированными. Обращение к функции такой библиотеки само по себе не вызывает переключения в режим ядра и является обычным вызовом подпрограммы.
В Unix, Unix-like и других POSIX-совместимых операционных системах популярными системными вызовами являются: open
, read
, write
, close
, wait
, exec
, fork
, exit
и kill
. Многие современные ОС имеют сотни системных вызовов. Например, Linux и OpenBSD, — каждый имеет около 380 разных вызовов[1][2], NetBSD имеет около 500[3], FreeBSD имеет более 500[4], в то время как Plan 9 имеет 51.[5]
Инструменты, такие как strace, sysdig и truss, наблюдают за исполнением процесса с самого начала и выводят все системные вызовы этого процесса или могут присоединяться к уже работающему процессу и перехватывают все системные вызовы, сделанные этим процессом, если операции не нарушают пользовательские разрешения.
Реализация системных вызовов требует передачи управления, которая предполагает некоторые специфические для определённой архитектуры детали. Классический способ реализации — использование прерываний (interruption, trap). Прерывания передают управление ядру ОС, при этом приложению нужно внести в определённые регистры процессора номер системного вызова и необходимые аргументы и выполнить инструкцию генерации программного прерывания.
Для многих RISC-процессоров это единственный способ, но архитектуры группы CISC (в том числе, широко используемые x86 и x86 64) имеют дополнительные методы. Например, специальные инструкции SYSCALL/SYSRET или SYSENTER/SYSEXIT (эти два механизма были разработаны независимо друг от друга AMD и Intel соответственно, но, по сути, выполняют одинаковые функции). Это инструкции «быстрой» передачи управления, которые разработаны для передачи управления к ОС для системных вызовов без прерываний.
Системные вызовы могут быть сгруппированы в пять больших категорий:
fork
в Unix-like, NtCreateProcess
в Windows_NT Native API)Системные вызовы в Unix-подобных системах обрабатываются в режиме ядра, которое завершается повышением режима выполнения процессора в более привилегированный, но изменение контекста процесса не требуется — однако при этом происходит изменение контекста привилегии. Системные ресурсы работают с учётом режима исполнения в соответствии со статусом регистра процессора и процессы — это своего рода абстракция, предоставляемая ОС. Системный вызов обычно не требует изменения контекста на другой процесс, напротив, он выполняется в контексте того процесса, который его вызвал.
В многопотоковых процессах системные вызовы могут исходить из разных потоков. Обработка таких системных вызовов полностью зависит от архитектуры ОС. Ниже приведены типичные модели, которые используются ядрами:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.