Модульная структура
Ядра большинства версий операционной системы UNIX являются монолитными. Напомним, что монолитное ядро — это ядро, которое виртуально включает в себя все возможности операционной системы в виде одного большого блока кода, который запускается как единый процесс в едином адресном пространстве. Все функциональные компоненты такого ядра имеют доступ ко всем его внутренним структурам данных и ко всем программам. При внесении изменений в любую из частей типичной монолитной операционной системы все ее модули и подпрограммы необходимо повторно компоновать и переустанавливать, а перед тем как изменения вступят в силу, систему нужно будет перезагрузить. В результате все модификации, такие, как добавление драйвера нового устройства или новых функций файловой системы, усложняются. Особенно остро эта проблема стоит в системе Linux, глобальную разработку которой выполняют объединенные на добровольных началах группы независимых программистов.
Для решения этой проблемы система Linux организована в виде набора относительно независимых блоков, которые называются загружаемыми модулями (loadable modules) [GOYE99]. Загружаемые модули Linux имеют две отличительные особенности.
• Динамическое связывание. Любой модуль ядра может быть загружен в память и подсоединен к ядру в то время, когда само ядро уже находится в
памяти и выполняется. Любой модуль может быть также отсоединен от ядра и удален из памяти в любой момент времени.
• Стековая организация. Модули организованы в виде определенной иерархической структуры. Отдельные модули могут выполнять роль библиотек при обращении к ним модулей более высоких уровней в рамках этой структуры; они
сами также могут обращаться к модулям на более низких уровнях.
Динамическое связывание [FRAN97] облегчает настройку системы и экономит память, которую занимает ядро. В системе Linux программа пользователя или сам пользователь может загружать или выгружать модули с помощью команд insmod и rmmod. Само ядро управляет работой отдельных функций и по мере надобности загружает нужные модули или выгружает те, нужда в которых уже отпала. Кроме того, стековая организация позволяет задавать зависимости модулей, что дает два основных преимущества.
1. Код, являющийся общим для набора однотипных модулей (например, драй
веры похожих устройств), можно поместить в один модуль, что позволяет
сократить количество повторений.
2. Ядро может проверить наличие в памяти нужных модулей, воздерживаясь
от выгрузки модуля, который нужен для работы других, зависимых от него, и загружая вместе с новым требуемым модулем все необходимые дополнительные модули.
На примере, приведенном на рис. 2.18, показаны структуры, которые используются операционной системой Linux для управления модулями. На рисунке приведен список модулей ядра после загрузки модулей FAT и VFAT. Каждый модуль задается двумя таблицами: таблицей модулей и таблицей символов. В таблицу модулей входят перечисленные ниже элементы.
• next. Указатель на следующий модуль. Все модули организованы в виде
связанного «писка. Этот список начинается псевдомодулем (на рис. 2.18 он
не показан).
• ref. Список модулей, которые используются данным модулем.
• symtab. Указатель на таблицу символов данного модуля.
• name. Имя модуля.
• size. Размер модуля в страницах памяти.
• addr. Начальный адрес модуля.
• state. Текущее состояние модуля.
• *cleanup(). Указатель на программу, которая запускается при выгрузке
данного модуля.
Рис. 2.18. Пример списка модулей ядра операционной системы Linux
Таблица символов определяет символы, контролируемые данным модулем и используемые где-либо еще. В таблицу входят такие элементы.
• size. Полный размер таблицы.
• n_symbols. Количество символов.
• n_refs. Количество ссылок,
• symbols. Таблица символов.
• references. Список модулей, зависящих от данного.
На рис. 2.18 модуль VFAT загружается после модуля FAT и зависит от него.
1 Краткое рассмотрение страничной организации памяти приведено в последующих разделах данной главы; более подробно этот материал изложен в главе 7, "Управление памятью".
2 Заштрихованная область представляет аппаратное обеспечение
4 Следует отметить, что процессы, как правило, обладают каждый своим отдельным адресным пространством, а у потоков адресное пространство общее.
5 Фирме IBM удалось собственными усилиями разработать операционную систему OS/2. Как и Windows NT, OS/2 Warp является современной многозадачной многопоточной операционной системой.
6 Только 16-битовые приложения OS/2. — Прим. ред
7 Здесь и в предыдущем пункте имеются в виду только 16-битовые приложения OS/2.
8 Подробнее об этой модели в приложении к W2K можно узнать, например, из книги Оберг Р. Технология СОМ+. Основы и программирование. — М.: Издательский дом "Вильяме", 2000
9 Более полное генеалогическое дерево приведено в [MCKU96].
Дата добавления: 2016-06-05; просмотров: 1642;