- •Глава 1. Основные понятия
- •1.1. Операционная система с точки зрения системного программиста
- •1.2. Классификация и предварительный обзор операционных систем
- •1.3. Точка зрения пользователя
- •1.4. Аппаратная архитектура и поддержка ос
- •1.5. Ядро и процессы
- •1.6. Архитектурные концепции операционных систем
- •Контрольные вопросы
1.3. Точка зрения пользователя
-
ОС есть набор программ, которые скрывают от пользователя детали управления оборудованием (hardware) и обеспечивают ему более удобную среду
Этот принцип иллюстрируется рисунком 1.4.
Рисунок 1.4 Операционная система, процессы, оборудование
Как видно из рисунка 1.4, ОС играет роль "прослойки" между процессами пользователей и оборудованием системы. (Под оборудованием понимаются, как правило, внешние устройства, но можно трактовать этот термин и шире, включая в него все первичные ресурсы). Процессы пользователей не имеют непосредственного доступа к оборудованию и, говоря шире, к системным ресурсам. Если процессу необходимо выполнить операцию с системным ресурсом, в том числе и с оборудованием, процесс выдает системный вызов. ОС интерпретирует системный вызов, проверяет его корректность, возможно, помещает в очередь запросов и выполняет его. Если выполнение вызова связано с операциями на оборудовании, ОС формирует и выдает на оборудование требуемые управляющие воздействия. Оборудование, выполнив операцию, заданную управляющими воздействиями, сигнализирует об этом прерыванием. Прерывание поступает в ядро ОС, которое анализирует его и формирует отклик для процесса, выдавшего системный вызов. Если выполнение системного вызова не требует операций на оборудовании, отклик может быть сформирован немедленно.
Управляющие воздействия и прерывания составляют интерфейс оборудования, системные вызовы и отклики на них – интерфейс процессов. В качестве синонима интерфейса процессов мы в соответствии со сложившейся в последнее время традицией часто будем употреблять аббревиатуру API (Application Programm Interface – интерфейс прикладной программы).
Отделение процессов пользователя от оборудования преследует две цели.
Во-первых – безопасность. Если пользователь не имеет прямого доступа к оборудованию и вообще к системным ресурсам, то он не может вывести их из строя или монопольно использовать в ущерб другим пользователям. Обеспечение этой цели нуждается в аппаратной поддержке, рассматриваемой в следующем разделе.
Во-вторых – обеспечение абстрагирования пользователя от деталей управления оборудованием. Вывод на диск, например, требует сложного программирования контролера дискового устройства, однако, все пользователи используют для этих целей простое обращение к драйверу устройства. Более того, в большинстве систем имеются библиотеки системных вызовов, обеспечивающие API для языков высокого уровня (прежде всего – для языка C). Можно также говорить о том, что ОС интегрирует ресурсы: из ресурсов низкого (физического) уровня она конструирует более сложные ресурсы, которые, с одной стороны, сложнее (по функциональным возможностям), а, с другой, проще (по управлению) низкоуровневых.
1.4. Аппаратная архитектура и поддержка ос
Существует несколько различных определений того, что следует считать аппаратной архитектурой ЭВМ, каждое из таких определений "работает" для определенного класса задач. Мы как программисты воспользуемся таким определением:
-
Аппаратной архитектурой называются те компоненты вычислительной системы, через которые программное обеспечение взаимодействует с аппаратурой.
Таким образом, в аппаратную архитектуру попадают не все компоненты компьютера, а только программно доступные – те, состоянием и действием которых программа может управлять или с которых программа может считать информацию. В состав этих средств входят:
система команд процессора;
регистры процессора;
память;
система ввода-вывода;
система прерываний.
Аппаратную поддержку управления памятью и вводом-выводом мы рассматриваем отдельно (в главах 3 и 6 соответственно).
Система команд процессора обеспечивает выполнение программой действий по обработке данных. Большинство команд в системе команд процессора имеет прикладное назначение, однако некоторые команды из набора команд процессора предназначены для организации управления вычислительным процессом и, таким образом, непосредственно поддерживают функционирование ОС. Такие команды в современных системах являются привилегированными – это, например, команды ввода-вывода и изменения состояния системы. Современные ОС рассчитаны на наличие в вычислительной системе двух (как минимум) режимов функционирования процессора – привилегированного режима (режим ядра в терминологии Unix) и непривилегированного режима (режим процесса в Unix). Если программа, выполняющаяся в режиме ядра, может выполнять любые команды, то для программы, выполняющейся в режиме процесса, привилегированные команды запрещены. Попытка программы выполнить привилегированную команду в режиме процесса вызывает исключение (см. ниже). В системе ESA, например, таких основных состояний два (есть еще ряд промежуточных) [20, 45], они называются "супервизор" и "задача", такие же названия они имеют в процессоре Power PC. В процессорах Intel-Pentium аналогичную роль играют уровни привилегий, они же – кольца защиты [32], причем из четырех аппаратно обеспечиваемых уровней привилегий в современных ОС используются два или три. Возможность для пользователя разрабатывать модули, работающие в режиме ядра, обычно строго регламентируется ОС. Хорошо защищенная ОС должна безоговорочно пресекать попытки процесса перейти в состояние ядра.
В число регистров процессора входят регистры общего назначения, которые в основном используются для манипулирования с прикладными данными, но также и специальные регистры, такие как регистр адреса команды, регистр флагов-признаков, регистр режима процессора и т.п. Содержимое регистра режима процессора определяет привилегированное или непривилегированное состояние процессора, команды, изменяющие содержимое этого регистра, обязательно являются привилегированными. В различных архитектурах специальные регистры могут либо представлять собой отдельные аппаратные компоненты, либо интегрироваться в более сложные аппаратные структуры.
Содержимое специальных аппаратных регистров процессора (обязательно включая регистр адреса команды) составляет вектор состояния программы/процесса. В большинстве процессорных архитектур вектор состояния может быть загружен в соответствующие регистры или считан из них в память одной или несколькими командами. Так, в процессорах Intel-Pentium имеется структура данных, называемая TSS (Task State Segment – сегмент состояния задачи), содержимое которой играет роль вектора состояния. При выполнении команд JMP или CALL, адресующих дескриптор TSS, процессор среди прочих действий сохраняет содержимое регистров в TSS текущей задачи и загружает регистры из TSS новой задачи [32]. В процессоре S/390 [20] имеется 8-байтная структура PSW (Program Status Word – слово состояния программы), содержащая значительную часть информации вектора состояния (кроме содержимого регистров общего назначения), и имеются две команды – LPSW и SPSW – для загрузки и запоминания PSW соответственно.
Прерывание состоит в прекращении выполнения текущей программы и передаче управления на другую программу – программу обработки прерывания. При этом сохраняется возможность возврата в прерванную программу, в ту точку, в которой ее выполнение было прервано. При всем разнообразии аппаратных архитектур выполнение прерывания в них происходит примерно по одному сценарию:
сохраняется вектор состояния прерванной программы (в стеке или в специально предназначенной для этого области оперативной памяти);
в регистры процессора загружается некоторый вектор состояния, заранее "заготовленный";
в "заготовленном" векторе состояния регистр адреса команды содержит адрес программы обработки прерывания, таким образом, управление передается на программу обработки прерывания;
как правило, программа обработки прерывания сохраняет содержимое регистров общего назначения, а затем выполняет действия, предусмотренные для данного прерывания;
после выполнения своих действий программа обработки прерывания восстанавливает содержимое регистров общего назначения прерванной программы, а затем восстанавливает ее запомненный ранее вектор состояния;
прерванная программа продолжает свое выполнение с точки прерывания, даже "не заметив", что было принято и обработано прерывание.
Различаются прерывания трех типов: внешние, программные и исключения.
Внешние прерывания поступают от источников, внешних по отношению к процессору. Такими источниками являются внешние устройства, другие процессоры и т.д. При помощи такого прерывания внешний источник сигнализирует о каком-либо изменении своего состояния, требующем реакции системы. Внешние прерывания являются важнейшим компонентом управления вводом-выводом. Внешнее прерывание является асинхронным, то есть оно поступает в непредсказуемые моменты и невозможно предугадать, какой участок программного кода будет прерван внешним прерыванием. Команды процессора обладают свойством атомарности в отношении внешних прерываний: внешнее прерывание не может быть принято, пока не закончится выполнение текущей команды. При сохранении вектора состояния в нем запоминается адрес той команды, которая должна выполняться после команды, во время выполнения которой произошло внешнее прерывание.
Программное прерывание вызывается специальной командой процессора (в Intel-Pentium мнемоника этой команды – INT, в S/390 – SVC). Выполняется программное прерывание так же, как и внешнее, но, в отличие от внешних, программные прерывания являются синхронными, так как они вызываются самой программой. Программные прерывания являются средством обращения процесса к ОС, механизмом системного вызова. Обычные команды передачи управления – типа команд CALL или JMP – изменяют регистр адреса команды, но не весь вектор состояния. Прерывание же позволяет изменить весь вектор состояния, то есть не только передать управление на другую программу, но и перевести процессор из непривилегированного режима в привилегированный.
Прерывания, называемые исключениями (exception) или ловушками (trap), вызываются ошибочными ситуациями при выполнении команды. В отличие от внешних или программных прерываний, исключения прерывают выполнение команды на середине. Вектор состояния, запоминаемый при выполнении исключения, таков, что его восстановление приводит к повторному выполнению команды, вызвавшей исключение. Исключение, например, генерируется при неправильном коде команды, при попытке выполнить привилегированную команду в не привилегированном режиме, при попытке команды обращения к недоступной области памяти и т.д. Как правило, обработка ОС прерывания-исключения приводит к принудительному завершению процесса, в котором произошло исключение (и запомненный вектор состояния уже не восстанавливается). Однако в некоторых случаях (некоторые из таких случаев рассматриваются нами в последующих главах) исключение является штатной ситуацией, замаскированной формой системного вызова, сигнализирующего ОС о необходимости выполнить для процесса некоторое обслуживание.