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

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

Таненбаум "Современные операционные системы" ст. 69,759

http://cs.mipt.ru/docs/courses/osstud/index/index.htm <<---сюда

http://habrahabr.ru/post

http://www.opennet.ru/docs/RUS

https://ru.wikipedia.org

Robert Love - System Programming (Все о системных вызовах) <<--- PDF

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

  • Интерфейс системных вызовов - представляет собой набор услуг ядра и определяет формат запросов на услуги. Процесс запрашивает услугу посредством системного вызова определенной процедуры ядра, внешне похожего на обычный вызов библиотечной функции. Ядро от имени процесса выполняет запрос и возвращает процессу необходимые данные.

Одной из целей, которые изначально ставились перед разработчиками UNIX, являлось создание удобной среды программирования. Во многом это справедливо и сегодня.

Программный интерфейс UNIX позволяет наглядно показать внутренние механизмы этой операционной системы.

Все версии UNIX предоставляют строго определенный ограниченный набор входов в ядро операционной системы, через которые прикладные задачи имеют возможность воспользоваться базовыми услугами, предоставляемыми UNIX. Эти точки входа получили название системных вызовов (system calls). Системный вызов, таким образом, определяет функцию, выполняемую ядром операционной системы от имени процесса, выполнившего вызов, и является интерфейсом самого низкого уровня взаимодействия прикладных процессов с ядром. Что касается файловой системы, то системные вызовы необходимы для создания, удаления, чтения или записи файлов. Перед тем как прочитать файл, его нужно разместить на диске и открыть, а после прочтения его нужно закрыть. Все эти функции осуществляют системные вызовы.

Седьмая редакция UNIX включала около 50 системных вызовов, современные версии, например, SVR4, предлагают более 120.

Системные вызовы обычно документированы в разделе 2 электронного справочника. В среде программирования UNIX они определяются как функции С, независимо от фактической реализации вызова функции ядра операционной системы. В UNIX используется подход, при котором каждый системный вызов имеет соответствующую функцию (или функции) с тем же именем, хранящуюся в стандартной библиотеке языка С (в дальнейшем эти функции будем для простоты называть системными вызовами). Функции библиотеки выполняют необходимое преобразование аргументов и вызывают требуемую процедуру ядра, используя различные приемы. Заметим, что в этом случае библиотечный код выполняет только роль оболочки, в то время как фактические инструкции расположены в ядре операционной системы. Помимо системных вызовов программисту предлагается большой набор функций общего назначения. Эти функции не являются точками входа в ядро операционной системы, хотя в процессе выполнения многие из них выполняют системные вызовы. Например, функция printf использует системный вызов write для записи данных в файл, в то время как функции stcpy(копирование строки) или atoi(преобразование символа в его числовое значение) вообще не прибегают к услугам операционной системы. Функции, о которых идет речь, хранятся в стандартных библиотеках С и наряду с системными вызовами составляют основу среды программи-

рования в UNIX. Подробное описание этих функций приведено в разделе 3 электронного справочника.

Таким образом, часть библиотечных функций является "надстройкой" над системными вызовами, обеспечивающей более удобный способ получения системных услуг. В качестве примера рассмотрим процесс получения текущей даты и времени. Соответствующий системный вызов time возвращает время в секундах, прошедшее с момента Epoch: 1 января 1970 года. Дополнительная интерпретация этого значения, такая как преобразование в вид, удобный для восприятия (дата и время) с учетом временной зоны, осуществляется библиотечными функциям ctime, localtime и т. д.). К этим функциям можно отнести функции библиотеки ввода/вывода, функции распределения памяти, часть функций управления процессами и т. д.

На рис. 2.1 показана схема взаимодействия приложения с ядром операционной системы при использовании системных вызовов и библиотечных функций.

Просмотреть системные вызовы в Linux c целями диагностики или отладки можно при помощи утилиты: strace

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

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

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

      • load

      • execute, exec()

      • 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

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

      • request device, release device

      • read, write, reposition

      • get/set device attributes

      • logically attach or detach devices

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

      • get/set time or date

      • get/set system data

      • get/set process, file, or device attributes

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

      • create, delete communication connection

      • send, receive messages

      • transfer status information

      • attach or detach remote devices