Программные прерывания


 

Программное прерывание реализует один из способов перехода на подпрограм­му с помощью специальной инструкции процессора, такой как INT в процессо­рах Intel Pentium, trap в процессорах Motorola, syscall в процессорах MIPS или Ticc в процессорах SPARC. При выполнении команды программного прерывания процессор отрабатывает ту же последовательность действий, что и при возник­новении внешнего или внутреннего прерывания, но только происходит это в предсказуемой точке программы — там, где программист поместил данную ко­манду.

Практически все современные процессоры имеют в системе команд инструкции программных прерываний. Одной из причин появления инструкций программ­ных прерываний в системе команд процессоров является то, что их использова­ние часто приводит к более компактному коду программ по сравнению с исполь­зованием стандартных команд выполнения процедур. Это объясняется тем, что разработчики процессора обычно резервируют для обработки прерываний не­большое число возможных подпрограмм, так что длина операнда в команде про­граммного прерывания, который указывает на нужную подпрограмму, меньше, чем в команде перехода на подпрограмму. Другой причиной применения программных прерываний вместо обычных инструкций вызова подпрограмм является возможность смены пользовательского режима на привилегированный одновременно с вызовом процедуры — это свойство программных прерываний поддерживается большинством процессоров.

В результате программные прерывания часто используются для выполнения ог­раниченного количества вызовов функций ядра операционной системы, то есть системных вызовов.

 

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

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

Реализация системных вызовов должна удовлетворять следующим требованиям:

· обеспечивать переключение в привилегированный режим;

· обладать высокой скоростью вызова процедур ОС;

· обеспечивать по возможности единообразное обращение к системным вызо­вам для всех аппаратных платформ, на которых работает ОС;

· допускать легкое расширение набора системных вызовов;

· обеспечивать контроль со стороны ОС за корректным использованием сис­темных вызовов.

Первое требование для большинства аппаратных платформ может быть выпол­нено только с помощью механизма программных прерываний. Поэтому будем считать, что остальные требования нужно обеспечить именно для такой реализа­ции системных вызовов. Как это обычно бывает, некоторые из этих требований взаимно противоречивы.

Децентрализованный способ обработки.

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

В большинстве ОС системные вызовы обслуживаются по централизованной схе­ме, основанной на существовании диспетчера системных вызовов (рис. 1, 6). При любом системном вызове приложение выполняет программное прерывание с определенным и единственным номером вектора. Например, ОС Linux исполь­зует для системных вызовов команду INT 80h, а ОС Windows NT (при работе на платформе Pentium) — INT 2Eh. Перед выполнением программного прерывания приложение тем или иным способом передает операционной системе номер сис­темного вызова, который является индексом в таблице адресов процедур ОС, реализующих системные вызовы (таблица sysent на рис. 1). Также некоторым способом передаются аргументы системного вызова.

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

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

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

Для ускорения выполнения некоторых достаточно простых системных вызовов, которым, к тому же не требуется работа в привилегированном режиме, требуемая работа полностью выполняется библиотечной функцией, выполняющей всю свою работу в пользовательском режиме в виртуальном ад­ресном пространстве процесса, но прикладной программист может об этом и не знать — для него системные вызовы и библиотечные функции выглядят едино­образно. Прикладной программист имеет дело с набором функций прикладного программного интерфейса — API (например, Win32 или POSIX), — состоящего и из библиотечных функций, часть из которых пользуется для завершения рабо­ты системными вызовами, а часть — нет.

 

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

Синхронный и асинхронный режим.

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

Асинхронный системный вызов не приводит к переводу процесса в режим ожида­ния после выполнения некоторых начальных системных действий, например за­пуска операции вывода-вывода, управление возвращается прикладному процес­су (рис. 2, 6).

 

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

 

 

 

б)

 

Рис. 2.Синхронные (а)и асинхронные (б) системные вызовы

 



Дата добавления: 2016-06-05; просмотров: 2678;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.