Динамическая загрузка и выгрузка драйверов

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

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

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

Поддержка нескольких файловых систем

Диски представляют особый род периферийных устройств, так как именно на них хранится большая часть как пользовательских, так и системных данных. Дан­ные на дисках организуются в файловые системы, и свойства файловой системы во многом определяют свойства самой ОС – ее отказоустойчивость, быстродей­ствие, максимальный объем хранимых данных. Популярность файловой систе­мы часто приводит к ее миграции из “родной” ОС в другие операционные систе­мы – например, файловая система FAT появилась первоначально в MS-DOS, но затем была реализована в OS/2, семействе MS Windows и многих реализациях UNIX. Ввиду этого поддержка нескольких популярных файловых систем для под­системы ввода-вывода также важна, как и поддержка широкого спектра периферийных устройств. Важно также, чтобы архитектура подсистемы ввода-вывода позволяла достаточно просто включать в ее состав новые типы файловых сис­тем, без необходимости переписывания кода. Обычно в операционной системе имеется специальный слой программного обеспечения, отвечающий за решение данной задачи, например слой VFS (Virtual File System) в версиях UNIX на осно­ве кода System V Release 4.

Поддержка синхронных и асинхронных

Операций ввода-вывода

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

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

Наши рекомендации