Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга 1 ОС.doc
Скачиваний:
104
Добавлен:
11.11.2018
Размер:
2.44 Mб
Скачать

2.3.2. Взаимодействие ос и выполняемого программой

В работе в режиме пользователя часто необходимое выполнение действий, реализованных в ядре ОС (например, во время записи на диск из прикладной программы). Для этого надо обеспечить взаимодействие программы пользователя и ОС. Рассмотрим особенности такого взаимодействия.

Системные вызовы и интерфейс между прикладной программой и ОС

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

Рассмотрим последовательность выполнения системного вызова.

  1. Предположим, что для процесса, который выполняется в режиме пользователя, нужна функция, реализованная в ядре системы.

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

  3. После получения управления ядро считывает параметры вызова и определяет, что нужно сделать.

  4. После этого ядро выполняет нужны действия, сохраняет в памяти значения, которые следует возвратить, и передает управление программе, которая его вызвала. Происходит переход назад в режим пользователя.

  5. Программа считывает из памяти сохраненные значения и продолжает свою работу.

Как видим, каждый системный вызов служит причиной перехода в привилегированный режим и назад (в микроядровой архитектуре, таких переходов может быть и больше).

Рассмотрим способы передачи параметров в системном вызове. К ним принадлежат:

  • передача параметров в регистры процессора;

  • занесение параметров в определенный участок памяти и передача указателя на нее в регистре процессора.

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

Взаимосвязь между функциями АРI и системными вызовами неодинаковы в разных ОС.

Во-первых, каждому системному вызову может быть поставленная в соответствие библиотечная функция, единственной задачей которой являются выполнения этого вызова. Такую функцию называют упаковщиком системного вызова. Для программиста в этом случае набор функций АРI выглядит как совокупность таких упаковщиков и дополнительных функций, реализованных библиотеками полностью или частично в режиме пользователя. Это решение принято за основу в UNIX и в таком случае принято говорить об использовании системных вызовов в прикладных программах (на самом деле программы вызывают упаковщики системных вызовов).

Во-вторых, можно предоставить для использования в прикладных программах универсальный интерфейс программирования применений (АРI режима пользователя) и полностью спрятать за ним набор системных вызовов. Для программиста каждая функция такого АРI является библиотечной функцией режима пользователя, упаковщика в этом случае нет, сведения о системных вызовах есть деталями реализации ОС. Это присуще WINDOWS -системам, где подобный универсальный набор функций называют Win32 АРI.

Программная совместимость

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

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

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

Сегодня такую совместимость обеспечивает стандартизация разработки программного обеспечения, а именно:

  • наличие стандарта на языки программирования (прежде всего на С и С++) и стандартных компиляторов;

  • наличие стандарта на интерфейс операционной системы (АРI).

Работа со стандартизации интерфейса операционных систем происходит в рамках проекта POSIX(Рогtable Орегating System Interface). Наиболее важным стандартом есть POSIX 1003.1, который описывает набор библиотечных процедур (таких, как открытие файла, создание нового процесса и т.п.), которые должны быть реализованы в системе. Этот процесс стандартизации длится до сих пор, последней редакцией стандарта является базовая спецификация Open Group/ІЕЕЕ. Указанные стандарты отображают традиционный набор средств, реализованных в UNIX-совместимых системах.

Задача обеспечения бинарной совместимости возникает тогда, когда нужно запустить на выполнение файл прикладной программы в среде другой операционной системы. Такая задача значительно сложнее в реализации, наиболее распространенный подход к его решению - эмуляция среды выполнения. В этом случае программа запускается под управлением другой программы - эмулятора, который обеспечивает динамическое преобразование инструкций программы в инструкции нужной архитектуры. Примером такого эмулятора является программа wine, которая дает возможность запускать программы, разработанные для Win32 АРI, в среде Linux через эмуляцию функций Win32 АРI системными вызовами Linux.