Системный вызов

Поделись знанием:
Перейти к: навигация, поиск

Систе́мный вы́зов (англ. system call) в программировании и вычислительной технике — обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции.

Современные операционные системы (ОС) предусматривают разделение времени между выполняющимися вычислительными процессами (многозадачность) и разделение полномочий, препятствующее обращению исполняемых программ к данным других программ и оборудованию. Ядро ОС исполняется в привилегированном режиме работы процессора. Для выполнения межпроцессной операции или операции, требующей доступа к оборудованию, программа обращается к ядру, которое, в зависимости от полномочий вызывающего процесса, исполняет либо отказывает в исполнении такого вызова.

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





Привилегии

Архитектура современных процессоров предусматривает использование защищенного режима с несколькими уровнями привилегий: приложения обычно ограничены своим адресным пространством таким образом, что они не могут получить доступ или модифицировать другие приложения, исполняемые в операционной системе, либо саму операционную систему, и обычно не могут напрямую получать доступ к системным ресурсам (жесткие диски, видеокарта, сетевые устройства и т. д.).

Для взаимодействия с системными ресурсами приложения используют системные вызовы, которые дают возможность операционной системе обеспечить безопасный доступ к ним. Системные вызовы передают управление ядру операционной системы, которое определяет, предоставлять ли приложению запрашиваемые ресурсы. Если ресурсы доступны, то ядро выполняет запрошенное действие, затем возвращает управление приложению.

Интерфейс системных вызовов

В Windows NT интерфейс системных вызовов — это часть Native API в библиотеке ntdll.dll; это недокументированный API, используемый реализациями обычного Windows API и напрямую используемый некоторыми системными приложениями Windows. В заголовочном файле ядра Linux sys/syscall.h доступна функция syscall, позволяющая непосредственно выполнять системные вызовы. Таблица системных вызовов Linux документирована и является частью API этой ОС.

Промежуточная библиотека

Как правило, система предоставляет библиотеку или 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 соответственно, но, по сути, выполняют одинаковые функции). Это инструкции «быстрой» передачи управления, которые разработаны для передачи управления к ОС для системных вызовов без прерываний.

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

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

  1. Управление процессами
    • load
    • execute
    • end (exit), abort
    • создание процесса (fork в Unix-like, NtCreateProcess в Windows_NT Native API)
    • завершение процесса
    • get/set process attributes
    • [en.wikipedia.org/wiki/Wait_(operating_system) wait] время, события, [en.wikipedia.org/wiki/Signal_(computing) signal] события
    • [en.wikipedia.org/wiki/Dynamic_memory_allocation allocate], [en.wikipedia.org/wiki/Garbage_collection_(computer_science) 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 последних версий.
  • Модель многие-к-многим: в этой модели во время системного вызова множество пользовательских потоков увязываются с множеством потоков уровня ядра.
  • Гибридная модель: в этой модели реализованы модели «многие-к-многим» и «один-к-одному» в зависимости от выбора ядра ОС.

Напишите отзыв о статье "Системный вызов"

Примечания

  1. [man7.org/linux/man-pages/man2/syscalls.2.html syscalls(2) - Linux manual page].
  2. OpenBSD. [bxr.su/OpenBSD/sys/kern/syscalls.c System call names (kern/syscalls.c)] (14 сентября 2013).
  3. NetBSD. [bxr.su/NetBSD/sys/kern/syscalls.c System call names (kern/syscalls.c)] (17 октября 2013).
  4. [fxr.watson.org/fxr/source/kern/syscalls.c FreeBSD syscalls.c, the list of syscall names and IDs].
  5. [plan9.bell-labs.com/sources/plan9/sys/src/libc/9syscall/sys.h Plan 9 sys.h, the list of syscall names and IDs].

Ссылки

  • [www-128.ibm.com/developerworks/linux/library/l-system-calls/][www.ibm.com/developerworks/linux/library/l-system-calls/ Kernel command using Linux system calls] IBM Developer Works  (англ.)


Отрывок, характеризующий Системный вызов

– Лучше, – неохотно отвечала Наташа.


На другой день, по совету Марьи Дмитриевны, граф Илья Андреич поехал с Наташей к князю Николаю Андреичу. Граф с невеселым духом собирался на этот визит: в душе ему было страшно. Последнее свидание во время ополчения, когда граф в ответ на свое приглашение к обеду выслушал горячий выговор за недоставление людей, было памятно графу Илье Андреичу. Наташа, одевшись в свое лучшее платье, была напротив в самом веселом расположении духа. «Не может быть, чтобы они не полюбили меня, думала она: меня все всегда любили. И я так готова сделать для них всё, что они пожелают, так готова полюбить его – за то, что он отец, а ее за то, что она сестра, что не за что им не полюбить меня!»
Они подъехали к старому, мрачному дому на Вздвиженке и вошли в сени.
– Ну, Господи благослови, – проговорил граф, полу шутя, полу серьезно; но Наташа заметила, что отец ее заторопился, входя в переднюю, и робко, тихо спросил, дома ли князь и княжна. После доклада о их приезде между прислугой князя произошло смятение. Лакей, побежавший докладывать о них, был остановлен другим лакеем в зале и они шептали о чем то. В залу выбежала горничная девушка, и торопливо тоже говорила что то, упоминая о княжне. Наконец один старый, с сердитым видом лакей вышел и доложил Ростовым, что князь принять не может, а княжна просит к себе. Первая навстречу гостям вышла m lle Bourienne. Она особенно учтиво встретила отца с дочерью и проводила их к княжне. Княжна с взволнованным, испуганным и покрытым красными пятнами лицом выбежала, тяжело ступая, навстречу к гостям, и тщетно пытаясь казаться свободной и радушной. Наташа с первого взгляда не понравилась княжне Марье. Она ей показалась слишком нарядной, легкомысленно веселой и тщеславной. Княжна Марья не знала, что прежде, чем она увидала свою будущую невестку, она уже была дурно расположена к ней по невольной зависти к ее красоте, молодости и счастию и по ревности к любви своего брата. Кроме этого непреодолимого чувства антипатии к ней, княжна Марья в эту минуту была взволнована еще тем, что при докладе о приезде Ростовых, князь закричал, что ему их не нужно, что пусть княжна Марья принимает, если хочет, а чтоб к нему их не пускали. Княжна Марья решилась принять Ростовых, но всякую минуту боялась, как бы князь не сделал какую нибудь выходку, так как он казался очень взволнованным приездом Ростовых.
– Ну вот, я вам, княжна милая, привез мою певунью, – сказал граф, расшаркиваясь и беспокойно оглядываясь, как будто он боялся, не взойдет ли старый князь. – Уж как я рад, что вы познакомились… Жаль, жаль, что князь всё нездоров, – и сказав еще несколько общих фраз он встал. – Ежели позволите, княжна, на четверть часика вам прикинуть мою Наташу, я бы съездил, тут два шага, на Собачью Площадку, к Анне Семеновне, и заеду за ней.
Илья Андреич придумал эту дипломатическую хитрость для того, чтобы дать простор будущей золовке объясниться с своей невесткой (как он сказал это после дочери) и еще для того, чтобы избежать возможности встречи с князем, которого он боялся. Он не сказал этого дочери, но Наташа поняла этот страх и беспокойство своего отца и почувствовала себя оскорбленною. Она покраснела за своего отца, еще более рассердилась за то, что покраснела и смелым, вызывающим взглядом, говорившим про то, что она никого не боится, взглянула на княжну. Княжна сказала графу, что очень рада и просит его только пробыть подольше у Анны Семеновны, и Илья Андреич уехал.
M lle Bourienne, несмотря на беспокойные, бросаемые на нее взгляды княжны Марьи, желавшей с глазу на глаз поговорить с Наташей, не выходила из комнаты и держала твердо разговор о московских удовольствиях и театрах. Наташа была оскорблена замешательством, происшедшим в передней, беспокойством своего отца и неестественным тоном княжны, которая – ей казалось – делала милость, принимая ее. И потом всё ей было неприятно. Княжна Марья ей не нравилась. Она казалась ей очень дурной собою, притворной и сухою. Наташа вдруг нравственно съёжилась и приняла невольно такой небрежный тон, который еще более отталкивал от нее княжну Марью. После пяти минут тяжелого, притворного разговора, послышались приближающиеся быстрые шаги в туфлях. Лицо княжны Марьи выразило испуг, дверь комнаты отворилась и вошел князь в белом колпаке и халате.
– Ах, сударыня, – заговорил он, – сударыня, графиня… графиня Ростова, коли не ошибаюсь… прошу извинить, извинить… не знал, сударыня. Видит Бог не знал, что вы удостоили нас своим посещением, к дочери зашел в таком костюме. Извинить прошу… видит Бог не знал, – повторил он так не натурально, ударяя на слово Бог и так неприятно, что княжна Марья стояла, опустив глаза, не смея взглянуть ни на отца, ни на Наташу. Наташа, встав и присев, тоже не знала, что ей делать. Одна m lle Bourienne приятно улыбалась.
– Прошу извинить, прошу извинить! Видит Бог не знал, – пробурчал старик и, осмотрев с головы до ног Наташу, вышел. M lle Bourienne первая нашлась после этого появления и начала разговор про нездоровье князя. Наташа и княжна Марья молча смотрели друг на друга, и чем дольше они молча смотрели друг на друга, не высказывая того, что им нужно было высказать, тем недоброжелательнее они думали друг о друге.
Когда граф вернулся, Наташа неучтиво обрадовалась ему и заторопилась уезжать: она почти ненавидела в эту минуту эту старую сухую княжну, которая могла поставить ее в такое неловкое положение и провести с ней полчаса, ничего не сказав о князе Андрее. «Ведь я не могла же начать первая говорить о нем при этой француженке», думала Наташа. Княжна Марья между тем мучилась тем же самым. Она знала, что ей надо было сказать Наташе, но она не могла этого сделать и потому, что m lle Bourienne мешала ей, и потому, что она сама не знала, отчего ей так тяжело было начать говорить об этом браке. Когда уже граф выходил из комнаты, княжна Марья быстрыми шагами подошла к Наташе, взяла ее за руки и, тяжело вздохнув, сказала: «Постойте, мне надо…» Наташа насмешливо, сама не зная над чем, смотрела на княжну Марью.
– Милая Натали, – сказала княжна Марья, – знайте, что я рада тому, что брат нашел счастье… – Она остановилась, чувствуя, что она говорит неправду. Наташа заметила эту остановку и угадала причину ее.
– Я думаю, княжна, что теперь неудобно говорить об этом, – сказала Наташа с внешним достоинством и холодностью и с слезами, которые она чувствовала в горле.
«Что я сказала, что я сделала!» подумала она, как только вышла из комнаты.
Долго ждали в этот день Наташу к обеду. Она сидела в своей комнате и рыдала, как ребенок, сморкаясь и всхлипывая. Соня стояла над ней и целовала ее в волосы.
– Наташа, об чем ты? – говорила она. – Что тебе за дело до них? Всё пройдет, Наташа.
– Нет, ежели бы ты знала, как это обидно… точно я…
– Не говори, Наташа, ведь ты не виновата, так что тебе за дело? Поцелуй меня, – сказала Соня.
Наташа подняла голову, и в губы поцеловав свою подругу, прижала к ней свое мокрое лицо.
– Я не могу сказать, я не знаю. Никто не виноват, – говорила Наташа, – я виновата. Но всё это больно ужасно. Ах, что он не едет!…
Она с красными глазами вышла к обеду. Марья Дмитриевна, знавшая о том, как князь принял Ростовых, сделала вид, что она не замечает расстроенного лица Наташи и твердо и громко шутила за столом с графом и другими гостями.


В этот вечер Ростовы поехали в оперу, на которую Марья Дмитриевна достала билет.
Наташе не хотелось ехать, но нельзя было отказаться от ласковости Марьи Дмитриевны, исключительно для нее предназначенной. Когда она, одетая, вышла в залу, дожидаясь отца и поглядевшись в большое зеркало, увидала, что она хороша, очень хороша, ей еще более стало грустно; но грустно сладостно и любовно.