Э. Таненбаум - Архитектура компьютера (1127755), страница 132
Текст из файла (страница 132)
Ядро постоянно находится в основной памяти и никуда не вытесняется, хотя временно может передавать управление для обслуживания прерываний ввода-вывода. Каждый драйвер устройств может управлять одним или несколькими устройствами ввода-вывода. Кроме того, драйвер устройств может выполнять ка- Примеры операционных систем 525 кие-то функции, не связанные с конкретным устройством, например шифрование потока ввода-вывода или даже обеспечение доступа к структурам данных ядра. Так как пользователи имеют возможность устанавливать новые драйверы устройств, они могут воздействовать на ядро и за счет этого испортить всю систему.
По этой причине драйверы нужно писать с особой осторожностью. Над ядром и драйверами устройств находится исполняющая система. Исполняющая система имеет независимую архитектуру, поэтому ее можно переносить на другие машины. Она состоит из трех уровней. Самый нижний уровень содержит файловые системы и диспетчер объектов. Файловые системы управляют файлами и каталогами. Диспетчер объектов управляет объектами, известными ядру, в том числе процессами, программными потоками (их еще называют легковесными процессами, действующими внутри адресного пространства), каталогами, семафорами, устройствами ввода-вывода, тактовыми генераторами и т.
п. Диспетчер объектов управляет также пространством имен, куда можно помещать новые объекты, потом при необходимости к этим объектам можно обращаться. Следующий уровень состоит из 6 основных частей, как показано на рис. 6.25. Диспетчер ввода-вывода обеспечивает управление устройствами ввода-вывода, а также предоставляет базовые услуги по вводу-выводу.
При этом диспетчер ввода-вывода использует службы файловой системы, которая, в свою очередь, использует драйверы устройств, а также службы диспетчера объектов. Диспетчер кзш-памяти имеет дело с файловыми блоками и помогает диспетчеру виртуальной памяти определить, какие из них надо сохранить в памяти для использования в будущем. Кроме того, диспетчер кэш-памяти управляет файлами, отображаемыми на память. Ж1пс1оюз ХР можно конфигурировать для работы с несколькими файловыми системами.
В этом случае диспетчер кэш-памяти управляет всеми файловыми системами, поэтому отдельный диспетчер для каждой из них не нужен. Когда требуется какой-либо файловый блок, нужно обращаться к диспетчеру кэш-памяти. Если диспетчер кэш-памяти не находит этот блок у себя, для его получения диспетчер направляет вызов соответствующей файловой системе. Поскольку файлы могут отображаться на адресные пространства процессов, диспетчер кэш-памяти должен взаимодействовать с диспетчером виртуальной памяти, чтобы обеспечить необходимую согласованность. Диспетчер виртуальной памяти реализует архитектуру виртуальной памяти с подкачкой страниц по требованию. Он управляет отображением виртуальных страниц на физические страничные кадры.
Таким образом, диспетчер виртуальной памяти вводит дополнительные правила защиты, которые ограничивают доступ каждого процесса только к тем страницам, которые принадлежат его адресному пространству. Он также обрабатывает некоторые системные вызовы, связанные с виртуальной памятью. Диспетчер процессов и потоков управляет процессами и программными потоками, в том числе их созданием и удалением. Акцент делается не на политику применения процессов и потоков, а на механизмы управления ими.
Монитор безопасности включает механизм безопасности Ъ'1пдоч з ХР, который соответствует требованиям Оранжевой книги министерства обороны США. В Оранжевой книге перечисляется огромное количество правил, которым должна 526 Глава б. Уровень операционной системы удовлетворять система, начиная с пароля и заканчивая обнулением виртуальных страниц перед их повторным использованием. Интерфейс графических устройств управляет выводом изображений на мониторе и принтерах. Он предоставляет системные вызовы, которые позволяют пользовательским программам записывать информацию на монитор или принтеры независимо от типов этих устройств.
Он также предоставляет драйверы устройств для вывода графики. В первых версиях ЪЪ1пс)очз ХР интерфейс графических устройств был реализован в пользовательском пространстве, однако производительность в этом случае оставляла желать лучшего, поэтому программисты компании М1сгозо(с перенесли его в ядро. Многими системными вызовами управляет также модуль ЪЪ'ш32. Изначально он тоже располагался в пользовательском пространстве, но позднее с целью повышения производительности был перемещен в ядро.
Самый верхний уровень исполняющей системы — системные службы. Они предоставляют интерфейс к исполняющей системе. Системные службы получают системные вызовы ЪЪ'шс(огсз ХР и для их выполнения вызывают другие части исполняющейся системы. Вне ядра находятся пользовательские программы и подсистема окружения. Потребность в подсистеме окружения объясняется тем, что пользовательские программы не ориентированы на самостоятельное выполнение системных вызовов (хотя технически такая возможность у ннх есть). Поэтому подсистема окружения экспортирует определенную группу вызовов функций, с которыми пользовательские программы могут работать. Изначально существовали три подсистемы окружения: ЪЪсш32 (для программ ЪЪ'шс1очсз ХТ, ЪЪ'шс)ои"з 2000, Ъ'шс1оггз ХР и ЪЪ'шс1ои з 95,'98/МЕ), РО31Х (для переносимых программ 111ч1Х) и 03/2 (для переносимых программ ОЯ/2). Из них на данный момент поддерживается только подсистема ЪЪс(п32.
В то же время, существует ряд новых служб модуля (11ч1Х, в некоторой степени обеспечивающих поддержку этой операционной системы. Приложения ЪЪс(пс(оч з используют функции подсистемы %'ш32 и взаимодействуют с этой подсистемой, чтобы делать системные вызовы. Подсистема ЪЪс1п32 принимает вызовы функций ЪЪ'1п32 и использует библиотечный модуль системного интерфейса (фактически он представляет собой ОЕ(.-файл — подробнее см. главу 7), чтобы их выполнять. Перейдем к обсуждению услуг, которые предоставляет операционная система ЪЪ'шс(ов"з ХР.
Ее интерфейс — это основное средство связи программиста с системой. К сожалению, компания М(сгозо(с не опубликовала полный список системных вызовов ЪЪсшс)ока ХР, и, кроме того, она меняет их от выпуска к выпуску. При таких обстоятельствах практически невозможно написание программ, непосредственно совершающих системные вызовы.
Зато компания М)сгозо(с определила набор функций, известный всем как %'ш32 АР1 (Арр11сас1оп Ргоягашш1пй 1псег1асе — прикладной программный интерфейс). Это библиотечные функции, которые выполняют определенные действия либо в системе путем системных вызовов, либо в некоторых случаях непосредственно в библиотечной процедуре пользовательского пространства или подсистеме ЪЪг1п32. Набор ЪЪсш32 АР1 при создании новых версий ЪЪ'шс(очз ХР не меняется. Однако помимо ЪЪ'1п32 АР1 существуют процедуры ЪЪ'1пс(осгз ХР Примеры операционных систем 527 АР1, которые в новых версиях ЪЪгшдотчз ХР могут меняться. Так как вызовы ЪЪг1п32 АР1 документированы и достаточно стабильны, мы сосредоточим наше внимание именно на них, а не на системных вызовах ЪЪ'1поотгз ХР.
Когда в ЪЪ'|пдои з была введена поддержка 64-разрядных машин, компания М1сгозо1г изменила название набора с ЪЪ'1п32 на ЪЪ'1п64, однако для наших целей изучения 32-разрядной версии вполне достаточно. В системах ЪЪ'1п32 АР1 н 1)Х1Х применяются совершенно разные подходы. В 111ч1Х все системные вызовы общеизвестны и формируют минимальный интерфейс: удаление хотя бы одного из них изменит функционирование операционной системы.
Подсистема ЪЪ'1п32 предоставляет избыточный интерфейс. Здесь часто одно и то же действие можно выполнить тремя или четырьмя разными способами. Кроме того, ЪЪ'1п32 включает в себя много функций, которые не являются системными вызовами (например, копирование целого файла). Многие вызовы ЪЪ'1п32 АР1 создают объекты ядра того или иного типа (файлы, процессы, программные потоки, каналы и т. п.). Каждый вызов, ведущий к созданию объекта ядра, возвращает вызывающей программе результат, который называется описателем (Ьапд1е).
Этот описатель впоследствии может применяться для выполнения операций с объектом. Для каждого процесса существует свой описатель. Он не может непосредственно передаваться другому процессу и использоваться этим процессом (дескрипторы файлов в 1)Х1Х тоже нельзя передавать другим процессам). Однако при определенных обстоятельствах можно продублировать описатель, передать его другим процессам и разрешить им доступ к объектам, которые принадлежат другим процессам.
Каждый объект имеет связанный с ним дескриптор безопасности, который определяет, кому разрешено, а кому запрещено совершать те или иные операции с объектом. Операционную систему ЪЪгшдотчз ХР иногда называют объектно-ориентированной, поскольку оперировать объектами ядра можно только по их описателям путем вызова методов (функций АР1). С другой стороны, она не поддерживает такие основные свойства объектно-ориентированной системы, как наследование и полиморфизм.
ЪЪ'1п32 АР1 имеется и в системе ЪЪ'шдочгз 95/98 (а также в операционной системе ЪЪгпк1отчз СЕ, предназначенной для установки в разного рода электронных устройствах), правда, с некоторыми исключениями. Например, ЪЪгшс1о яз 95/98 не имеет защиты, поэтому те вызовы, которые связаны с защитой, просто возвраюают код ошибки. Кроме того, для имен файлов в ЪЪг1пдотчз ХР используется набор символов 1 1п1соде, который не поддерживается в ЪЪ'шдотчз 95/98. Существуют различия в параметрах некоторых вызовов АР1. В ЪЪ'шдотгз ХР, например, все экранные координаты являются 32-разрядными числами, а в ЪЪ'шдотчз 95/98 используются только младшие 16 бит (для совместимости с ЪЪ'шдотчз 3.1).
Поддержание набора функций ЪЪ"ш32 АР1 на разных операционных системах упрошает перенос программ между ними, но при этом кое-что в реальной системе вызовов остается недоступным. Примеры виртуальной памяти В этом подразделе мы поговорим о виртуальной памяти в БХ1Х и ЪЪ'шоотчз ХР. С точки зрения программиста они во многом сходны. 528 Глава 6. Уровень операционной системы Виртуальная память 0й!Х Модель памяти 1Л~ПХ довольно проста. Каждый процесс имеет три сегмента: код, данные и стек, как показано на рис. 6.26. В машине с линейным адресным пространством код обычно располагается в нижней части памяти, а за ним следуют данные. Стек помещается в верхней части памяти. Размер кода фиксирован, а данные и стек могут увеличиваться или уменыпаться.