Системные вызовы
Большинство ОС организуют свои функции в виде набора процедур, которые могут быть вызваны задачами.
Для защиты ОС прикладные программы и данные помещает в менее привилегированные сегменты. Для того, чтобы задача могла осуществить вызов защищенной системой процедуры, ОС должна определить одну или несколько точек входа. Такие точки называются шлюзами.
Имеются два типа шлюзов, которые могут быть использованы в качестве входных точек ОС – шлюзы ловушек и вызовов.
Оба типа похожи друг на друга, однако шлюз вызова позволяет сделать интерфейс ОС идентичным интерфейсу обычной процедуры.
Применяя шлюзы вызовов, можно пользоваться общим набором соглашений для вызова любых процедур. Шлюз содержит логический адрес точки входа и набор атрибутов, наиболее важный – уровень привилегий шлюза. Он определяет уровни привилегий, которые необходимы для использования шлюза.
Вызывающая программа должна иметь уровень привилегий, по крайней мере, такой же значимости как и шлюз.
Чтобы сделать сервисные функции доступными для всех задач, ОС обычно помещает их шлюзы в GDT.
Для осуществления вызова через шлюз ловушки, задача выполняет команду прерывания. При вызове через шлюз вызова – команду обычного межсегментного перехода. Обе команды изменяют уровень привилегий задачи, переходят к стеку, определенному для старшего уровня привилегий. ОС должна иметь собственный стек, чтобы гарантировать его достаточные размеры. Передача параметров сервисным процедурам может осуществляться 2-я способами:
– перед вызовом через шлюз вызова, задача может заслать параметры в свой стек. Процедура автоматически копирует параметры в более привилегированный стек;
– системы, которые осуществляют вызовы через шлюз ловушек, могут пересылать параметры в регистрах.