В этом режиме работает код ядра операционной системы, причем исполняется он в адресном пространстве и в контексте вызвавшей его задачи. Таким образом, ядро операционной системы имеет полный доступ к памяти пользовательской программы, и при системном вызове достаточно передать адреса одной или нескольких областей памяти с параметрами вызова и адреса одной или нескольких областей памяти для результатов вызова.
Системный вызов позволяет приложению обратиться к операционной системе с просьбой выполнить то или иное действие, оформленное как процедура (или набор процедур) программного кода ОС.
Для прикладного программиста операционная система выглядит как некая библиотека, предоставляющая некоторый набор полезных функций, с помощью которых можно упростить прикладную программу или выполнить действия, запрещенные в пользовательском режиме, например обмен данными с устройством ввода-вывода.
Реализация системных вызовов должна удовлетворять следующим требованиям:
1. обеспечивать переключение в привилегированный режим;
2. обладать высокой скоростью вызова процедур ОС;
3. обеспечивать по возможности единообразное обращение к системным вызовам для всех аппаратных платформ, на которых работает ОС;
4. допускать легкое расширение набора системных вызовов;
5. обеспечивать контроль со стороны ОС за корректным использованием системных вызовов.
В большинстве ОС системные вызовы обслуживаются по централизованной схеме, основанной на существовании диспетчера системных вызовов.
При любом системном вызове приложение выполняет программное прерывание с определенным номером. Перед вы-полнением программного прерывания приложение тем или иным способом передает операционной системе номер системного вызова, который является индексом в таблице адресов процедур ОС, реализующих системные. Также передаются аргументы системного вызова.
Диспетчер системных вызовов обычно представляет собой простую программу, которая:
1. сохраняет содержимое регистров процессора в системном стеке,
2. проверяет, попадает ли запрошенный номер вызова в поддерживаемый ОС диапазон (то есть не выходит ли номер за границы таблицы),
3. передает управление процедуре ОС, адрес которой задан в таблице адресов системных вызовов.
Процедура реализации системного вызова извлекает из системного стека аргументы и выполняет заданное действие. Это действие может быть весьма простым, например чтение значения системных часов, так что системный вызов оформляется в виде одной функции. Более сложные системные вызовы, такие как чтение из файла или выделение процессу дополнительного сегмента памяти, требуют обращения основной функции системного вызова к нескольким внутренним процедурам ядра ОС, принадлежащим к различным подсистемам, таким как подсистема ввода-вывода или управления памятью.
После завершения работы системного вызова управление возвращается диспетчеру, при этом он получает также код завершения этого вызова. Диспетчер восстанавливает регистры процессора, помещает в определенный регистр код возврата и выполняет инструкцию возврата из прерывания, которая восстанавливает непривилегированный режим работы процессора.
Описанный табличный способ организации системных вызовов принят практически во всех операционных системах. Он позволяет легко модифицировать состав системных вызовов, просто добавив в таблицу новый адрес и расширив диапазон допустимых номеров вызовов.
Операционная система может выполнять системные вызовы в синхронном или асинхронном режимах.
Синхронный системный вызов означает, что процесс, сделавший такой вызов, приостанавливается (переводится планировщиком ОС в состояние ожидания) до тех пор, пока системный вызов не выполнит всю требующуюся от него работу. После этого планировщик переводит процесс в состояние готовности и при очередном выполнении процесс гарантированно может воспользоваться результатами завершившегося к этому времени системного вызова. Синхронные вызовы называются также блокирующими, так как вызвавший системное действие процесс блокируется до его завершения.
Асинхронный системный вызов не приводит к переводу процесса в режим ожидания после выполнения некоторых начальных системных действий, например запуска операции вывода-вывода, управление возвращается прикладному процессу.
Большинство системных вызовов в операционных системах являются синхронными, так как этот режим избавляет приложение от работы по выяснению момента появления результата вызова. Вместе с тем в новых версиях операционных систем количество асинхронных системных вызовов постепенно увеличивается, что дает больше свободы разработчикам сложных приложений. Особенно нужны асинхронные системные вызовы в операционных системах на основе микроядерного подхода, так как при этом в пользовательском режиме работает часть ОС, которым необходимо иметь полную свободу в организации своей работы, а такую свободу дает только асинхронный режим обслуживания вызовов микроядром.
Исключительная ситуация
Исключительная ситуация — событие, возникающее в результате попытки выполнения программой команды, которая по каким-то причинам не может быть выполнена до конца. Примерами таких команд могут быть попытки доступа к ресурсу при отсутствии достаточных привилегий или обращения к отсутствующей странице памяти. Исключительные ситуации, как и системные вызовы, являются синхронными событиями, возникающими в контексте текущей задачи.
Исключительные ситуации можно разделить на исправимые и неисправимые.
1. К исправимым относятся такие исключительные ситуации, как отсутствие нужной информации в оперативной памяти. После устранения причины исправимой исключительной ситуации программа может выполняться дальше. Возникновение в процессе работы операционной системы исправимых исключительных ситуаций считается нормальным явлением.
2. Неисправимые исключительные ситуации чаще всего возникают в результате ошибок в программах (например, деление на ноль). Обычно в таких случаях операционная система реагирует завершением программы, вызвавшей исключительную ситуацию.
Файлы
Файл – это именованная совокупность данных на диске.
Характеристики файла:
1. Имя.
2. Тип.
3. Метаданные.
Имя файла – это обозначение файла, необходимое для обращения к нему.
Конкретные правила составления имен файлов варьируются от системы к системе, но все ныне существующие операционные системы в качестве допустимых имен файлов позволяют использовать от одной до восьми букв. Поэтому для имен файлов можно использовать слова andrea, bruce и cathy. Зачастую допускается также применение цифр и специальных символов, поэтому допустимы также такие имена, как 2, urgent!, и Fig.2-14. Многие файловые системы поддерживают имена длиной до 255 символов.
Некоторые файловые системы различают буквы верхнего и нижнего регистров, а некоторые не делают таких различий. Система UNIX подпадает под первую категорию, a MS-DOS — под вторую. Поэтому система UNIX может рассматривать все последующие сочетания символов как имена трех разных файлов: maria, Maria и MARIA. В MS-DOS все эти имена относятся к одному и тому же файлу.
Многие операционные системы поддерживают имена файлов, состоящие из двух частей, разделенных точкой, как в имени prog.с. Та часть имени, которая следует за точкой, называется расширением имени файла и, как правило, несет в себе некоторую информацию о файле. К примеру, в MS-DOS имена файлов состоят из 1-8 символов, плюс к этому необязательное расширение, состоящее из 1-3 символов. В UNIX размер расширения, если таковое имеется, выбирает сам пользователь, и имя файла может иметь даже два и более расширений, как в имени homepage.html.zip, где .html указывает на наличие веб-страницы в коде HTML, a .zip — на то, что этот файл (homepage.html) был сжат программой zip.
Основные правила именования файлов:
1) Короткое имя (формат MS DOS, формат 8.3). До появления ОС Windows 95 был принят формат имени 8.3 (MS-DOS). Имя файла состоит из двух частей: собственно имени и расширения. В MS-DOS имя файла может содержать от 1 до 8 символов. Расширение имени файла является необязательным, однако многие программы требуют, чтобы файл конкретного типа обладал и конкретным расширением. Оно, как правило, описывает содержание файла, поэтому использование расширения весьма удобно. Расширение начинается с точки, за которой следует от одного до трех символов. Имя и расширение могут состоять из прописных и строчных латинских букв, цифр и символов, кроме недопустимых
\ / пробел , ; . : + = * ? [ ] < >
Соглашение 8.3не является стандартом, и потому в ряде случаев отклонения от правильной формы записи допускаются как операционной системой, так и ее приложениями. Так, например, в большинстве случаев система «не возражает» против использования некоторых специальных символов (восклицательный знак, символ подчеркивания, дефис, тильда и т. п.), а некоторые версии MS-DOSдаже допускают использование в именах файлов символов русского и других алфавитов.
2) Длинное имя (формат Windows). Основным недостатком «коротких» имен является их низкая содержательность. Далеко не всегда удается выразить несколькими символами характеристику файла, поэтому с появлением операционной системы Windows 95было введено понятие «длинного» имени. Такое имя может содержать до 255 символов. Этого вполне достаточно для создания содержательных имен файлов. «Длинное» имя может содержать любые символы, кроме девяти специальных: