
- •Операционные системы История появления
- •Основные функции операционных систем
- •Классификация операционных систем
- •Семейства операционных систем
- •Выбор операционной системы
- •Открытые системы
- •Представление данных в вычислительных системах Представление чисел
- •Представление текстовых данных
- •Представление изображений
- •Прорисовка букв и цифр. Шрифты
- •Представление звуков
- •Упаковка данных
- •Контроль целостности информации
- •Введение в криптографию
- •Загрузка программ
- •Абсолютная загрузка
- •Разделы памяти
- •Относительная загрузка
- •Базовая адресация
- •Позиционно-независимый код
- •Оверлеи (перекрытия)
- •Сборка программ
- •Сборка в момент загрузки
- •Динамические библиотеки
- •Загрузка самой ос
- •Управление оперативной памятью
- •Открытая память
- •Алгоритмы динамического управления памятью
- •Сборка мусора
- •Системы с базовой виртуальной адресацией
- •Параллельное выполнение процессов
- •Системы, управляемые событиями
- •Windows9Xкак пример системы, управляемой событиями
- •Реализация многозадачности на однопроцессорных компьютерах
- •Внешние устройства
- •Доступ к внешним устройствам
- •Простые внешние устройства
- •Порты передачи данных
- •Шины передачи данных
- •Устройства графического вывода
- •Запоминающие устройства прямого доступа
- •Драйверы внешних устройств
- •Функции драйверов
- •Многоуровневые драйверы
- •Загрузка драйверов
Функции драйверов
Прежде всего, драйвер должен иметь функции, вызываемые ядром при загрузке и выгрузке модуля и при подключении модуля к конкретным устройствам. Например, в Sun Solaris это перечисленные функции:
1. – инициализация драйвера. Эта функция вызывается при загрузке модуля. Драйвер должен зарезервировать все необходимые ему системные ресурсы и проинициализировать собственные глобальные переменные. Инициализация устройства на этом этапе не происходит.
2. – проверить наличие устройства в системе. Во многих системах эта функция реализуется не самим драйвером, а специальным модулем-“сниффером” (sniffer – дословно, “нюхач”), используемым программой автоконфигурации.
3. – инициализация копии драйвера, управляющей конкретным устройством. Эту функцию можно рассматривать как аналог конструктора объекта в объектноориентированном программировании. Если в системе присутствует несколько устройств, управляемых одним драйвером, некоторые ОС загружают несколько копий кода драйвера, но в системах семейства Unix эта функция просто вызывается многократно.Каждая из инициализированных копий драйвера имеет собственный блок локальных переменных, в которых хранятся переменные состояния устройства. При вызове инициализации драйвер должен прочитать конфигурационный файл, где записаны параметры устройства (номенклатура этих параметров зависит от устройства и от драйвера), разместить и проинициализировать блок переменных состояния, зарегистрировать обработчики прерываний, проинициализировать само устройство и, наконец, зарегистрировать устройство как доступное для пользовательских программ, создав для него минорную запись (minor node). В ряде случаев драйвер создает для одного устройства несколько таких записей. Пример: в большинстве систем семейства Unix лентопротяжные устройства имеют две минорные записи. Одно из этих устройств при открытии перематывает ленту к началу, другое не перематывает. В действительности оба устройства управляются одним и тем же драйвером, который определяет текущий режим работы в зависимости от указанной минорной записи.
4. – деинициализация драйвера (аналог деструктора объекта в ООП). Впрочем, в отличие от деструктора, эта операция не безусловна – если не удается нормально завершить обрабатываемые в данный момент операции над устройством, драйвер может и даже обязан отказаться деинициализироваться. При деинициализации драйвер должен освободить все системные ресурсы, которые он занял при инициализации и в процессе работы (в том числе и уничтожить минорную запись) и может, если это необходимо, произвести какие-то операции над устройством, например, выключить приемопередатчик, запарковать головки чтения-записи и т. д. После того, как все устройства, управляемые драйвером, успешно деинициализированы, система может его выгрузить.
5. – выгрузка драйвера. Драйвер обязан освободить все ресурсы, которые он занял на этапе инициализации модуля, а также все ресурсы, занятые им во время работы на уровне модуля (не привязанные к конкретному управляемому устройству).
После того, как драйвер проинициализировался и зарегистрировал минорную запись, пользовательские программы могут начинать обращаться к нему и к управляемым им устройствам. Понятно, что обеспечить единый интерфейс к разнообразным категориям устройств сложно. Наиболее радикально подошли к этой проблеме разработчики системы UNIX, разделившие все устройства на два класса (блочные и последовательные) и определившие операции над устройствами каждого из них.