ЗНАЕТЕ ЛИ ВЫ?

Реализация безопасности в UNIX



Когда пользователь входит в систему, программа регистрации login (которая явля­ется SETUID root) запрашивает у пользователя его имя и пароль. Затем она хэширует пароль и ищет его в файле паролей /etc/passwd, чтобы определить, соответ­ствует ли хэш-код содержащимся в нем значениям. Хэширование применяется, чтобы избежать хранения паро­ля в незашифрованном виде где-либо в системе. Если пароль введен верно, про­грамма регистрации считывает из файла /etc/passwd имя программы оболочки, которую предпочитает пользователь. Ей может быть программа sh, но это также может быть и другая оболочка, например csh или ksh. Затем программа регистрации ис­пользует системные вызовы setuld и setgid, чтобы установить для себя UID и GID. После этого программа регистрации открывает клавиатуру для стандартного ввода (файл с дескрипто­ром 0) и экран для стандартного вывода (файл с дескриптором 1), а также экран для вывода стандартного потока сообщений об ошибках (файл с дескриптором 2). Наконец, она выполняет оболочку, которую указал пользователь, таким образом, завершая свою работу.

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

Когда любой процесс пытается открыть файл, система сначала проверяет биты защиты в i-узле файла для заданных значений рабочих UID и GID, чтобы опреде­лить, разрешен ли доступ для данного процесса. Если доступ разрешен, файл от­крывается и процессу возвращается дескриптор файла. В противном случае файл не открывается, а процессу возвращается значение –1. При последующих обраще­ниях к системным вызовам read и write проверка не выполняется. В результате, если режим защиты файла изменяется уже после того, как файл открыт, новый режим не повлияет на процессы, которые уже успели открыть этот файл.

В операционной системе Linux защита файлов и ресурсов осуществляется так же, как и в UNIX.

Резюме

 

Операционная система UNIX широко используется на вычислительных маши­нах различных классов от ноутбуков до суперкомпьютеров. В операционной системе UNIX есть три интерфейса: оболочка, библиотека языка С и сами системные вызовы. Оболочка позво­ляет пользователям вводить команды и исполнять их. Это могут быть простые команды, конвейеры или более сложные структуры. Ввод и вывод могут пере­направляться. В библиотеке С содержатся системные вызовы, а также множество расширенных вызовов. Каждый из системных вызовов выполняет определенные необходимые функции.

К ключевым понятиям операционной системы UNIX относятся процесс, модель памяти, ввод-вывод и файловая система. Процессы могут создавать дочерние про­цессы, в результате чего формируются деревья процессов. Для управления про­цессами в UNIX используются две ключевые структуры данных: таблица процес­сов и структура пользователя. Таблица процессов постоянно находится в памяти, а структура пользователя может выгружаться на диск. При создании процесса дублируется запись в таблице процессов, а также образ памяти процесса. Для пла­нирования применяется алгоритм, основанный на приоритетах, отдающий пред­почтение интерактивным процессам.

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

Доступ к устройствам ввода-вывода осуществляется при помощи специальных файлов, у каждого из которых есть старший номер устройства и младший номер устройства. Для снижения числа обращений к диску в блочных устройствах вво­да-вывода применяется буферный кэш. Для управления кэшем используется ал­горитм LRU (Least-Recently-Used – «наиболее давнего использования»). Сим­вольный ввод-вывод может осуществляться в обработанном и необработанном режимах. Для дополнительных возможностей символьного ввода-вывода приме­няются дисциплины линии связи или потоки.

Файловая система в UNIX – иерархическая, с файлами и каталогами. Все диски монтируются в единое дерево каталогов, начинающееся в одном корне. Отдельные файлы могут быть связаны с любым каталогом дерева. Чтобы пользоваться файлом, его нужно сначала открыть. При этом процессу, открывающему файл, возвращает­ся дескриптор файла, который затем используется при чтении этого файла и запи­си в файл. Внутри файловая система использует три основные таблицы: таблицу дескрипторов файлов, таблицу дескрипторов открытых файлов и таблицу i-узлов. Из этих таблиц таблица i-узлов является наиболее важной. В ней содержится ин­формация, необходимая для управления файлом и позволяющая найти его блоки.

Защита файлов основывается на регулировании доступа для чтения, записи и исполнения, предоставляемого владельцу файла, членам его группы и всем осталь­ным пользователям. Для каталогов бит исполнения интерпретируется как разре­шение поиска в каталоге.

 

 

Контрольные вопросы и задания

 

1. Опишите интерфейсы ОС UNIX.

2. Каковы особенности оболочки и утилит системы UNIX?

3. Дайте определение программы, называемой фильтром.

4. Как называются файлы, содержащие команды оболочки?

5. В чем заключается идея стандартизации обслуживающих программ UNIX?

6. Представьте состав нижнего уровня ядра UNIX.

7. Какие функции выполняет уровень системы виртуальной памяти UNIX?

8. Назовите главные функции уровня интерфейсов системы UNIX.

9. Какие функции выполняют в UNIX фоновые процессы, называемые демо­нами?

 

10. Опишите механизмы взаимодействия и синхронизации процессов в UNIX.

11. Какие структуры данных, относящиеся к процес­сам, поддерживает ядро системы UNIX?

12. Перечислите категории информации, хранящейся в таблице процессов.

13. Какие данные составляют структуру пользователя?

14. Опишите этапы создания процесса в системе UNIX.

15. Охарактеризуйте методы планирования в ОС семейства UNIX .

16. Из каких сегментов состоит адресное пространство в UNIX?

17. В чем заключается свойство отображения файлов на адресное пространство памяти?

18. Опишите способы реализации управления памятью в UNIX .

19. Как работает механизм страничной подкачки в UNIX?

20. Поясните структуру карты памяти и реализацию алгоритма замещения страниц.

21. Опишите реализацию ввода-вывода в ОС UNIX .

22. Дайте определение понятию «сокет» и перечислите наиболее распространенные типы сокетов.

23. Охарактеризуйте решения, применяемые в UNIX для структурирования драйверов символьных устройств и придания им свойства модульности.

24. Какие типы файлов поддерживаются в ОС UNIX?

25.Как реализована классическая файловая система UNIX.

26. В чем заключаютсяособенности реализация файловой системы Berkeley Fast?

27. Представьте реализацию файловых систем Linux.

28. Охарактеризуйте файловую систему NFS.

29. Каким образом реализуется свойство автомонтировки файловых систем в UNIX?

30. К каким проблемам приводит использование кэширования данных

в файловой системе NFS?

31. Опишите функционирование системы безопасности в UNIX.


Пример практической реализации

Операционной системы: Windows 2000

Обзор структуры операционной систем Windows 2000

 

Структура системы

Операционная система Windows 2000 состоит из двух основных частей: самой опе­рационной системы, работающей в режиме ядра, и подсистем окружения, работа­ющих в режиме пользователя. Ядро является традиционным ядром в том смысле, что оно управляет процессами, памятью, файловой системой и т. д. Подсистемы окружения являются отдельными процессами, помогающими пользователю выполнять определенные систем­ные функции.

Одно из многих усовершенствований системы NT по сравнению с Windows 3.1 заключалось в ее модульной структуре. Она состояла из относительно небольшо­го ядра, работавшего в режиме ядра, плюс нескольких серверных процессов, рабо­тавших в режиме пользователя. Процессы пользователя взаимодействовали с сер­верными процессами с помощью модели клиент-сервер: клиент посылал серверу сообщение, а сервер выполнял определенную работу и возвращал клиенту резуль­тат в ответном сообщении. Такая модульная структура упрощала перенос систе­мы на другие компьютеры. В результате операционная система Windows NT была успешно перенесена на платформы с процессорами, отличными от процессоров Intel, а именно: Alpha корпорации DEC, Power PC корпорации IBM и MIPS фир­мы SGI. Кроме того, такая структура защищала ядро от ошибок в коде серверов. Однако для увеличения производительности, начиная с версии NT 4.0, довольно большая часть операционной системы (например, управление системными вызо­вами и вся экранная графика) были возвращены в ядро. Такая схема сохранилась и в Windows 2000.

Тем не менее в операционной системе Windows 2000 сохранилась некоторая структура. Система разделена на несколько уровней, каждый из которых пользу­ется службами лежащего ниже уровня. Два нижних уровня программного обеспечения – уровень так называемых аппаратных абстрак­ций и ядро написаны на языке С и ассемблере и являются частично машинно-зависимыми. Верхние уровни написаны исключи­тельно на С и почти полностью машинно-независимы. Драйверы написаны на С или, в некоторых случаях, на C++.

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

Одна из целей создания Windows 2000 (и Windows NT) заключалась в возмож­ности переносить систему на другие платформы. В идеале при появлении новой машины для запуска операционной системы на ней нужно всего лишь переком­пилировать операционную систему новым компилятором для данной машины. К сожалению, в реальности сделать это не совсем просто. Хотя можно добиться полной переносимости верхних уровней операционной системы (так как в основном они имеют дело с внут­ренними структурами данных), нижние уровни работают с регистрами устройств, прерываниями, DMA и другими аппаратными особенностями, которые очень силь­но отличаются на разных машинах. Несмотря на то, что большая часть кода нижнего уровня напи­сана на С, даже ее нельзя просто перенести с процессора Pentium на процессор Alpha, перекомпилировать и перезагрузить, так как существует большое количе­ство мелких различий между этими процессорами, не имеющих отношения к раз­личиям в наборе команд, которые невозможно спрятать компилятором.

Корпорация Microsoft, хорошо представляя себе эту проблему, предприняла серьез­ные попытки скрыть многие из аппаратных различий в тонком уровне на самом дне системы, названном уровнем аппаратных абстракций (HAL, Hardware Abstraction Layer). Работа уровня HAL заключается в том, чтобы предоставлять всей остальной системе абстрактные аппаратные устройства, свободные от индиви­дуальных отличительных особенностей, которыми так богато реальное аппарат­ное обеспечение. Эти устройства представляются в виде машинно-независимых служб (процедурных вызовов и макросов), которые могут использоваться осталь­ной операционной системой и драйверами. Поскольку драйверы и ядро пользуются службами HAL (идентичными на всех операционных системах Windows 2000, не­зависимо от аппаратного обеспечения) и не обращаются напрямую к устройствам, требуется значительно меньше изменений для их переноса на другую платформу. Перенос самого уровня HAL довольно прост, так как весь машинно-зависимый код сконцентрирован в одном месте, а цель переделки четко определена, то есть за­ключается в реализации всех служб уровня HAL.

В уровень HAL включены те службы, которые зависят от набора микросхем материнской платы и меняются от машины к машине в разумных предсказуемых пределах. Другими словами, он разработан, чтобы скрывать различия между материнскими платами различных производителей, но не различия между процес­сорами Pentium и Alpha. К службам уровня HAL относятся: доступ к регистрам устройств, адресация к устройствам, независящим от шины, обработка прерыва­ний и возврат из прерываний, операции прямого доступа к памяти (DMA), управление таймерами, часами реального времени, спин-бло­кировками нижнего уровня и синхронизация многопроцессорных конфигура­ций, интерфейс с BIOS и доступ к CMOS-памяти. Уровень HAL не предоставляет абстракций или служб для специфических устройств ввода-вывода – клавиатур, мышей или дисков, а также блоков управления памятью.

Драйверам часто бывает нужно получить доступ к специфическим устройствам ввода-вывода. На аппаратном уровне у драйвера есть один или несколько адресов определенной шины. Поскольку у современных компьютеров часто есть несколь­ко шин (PCI, SCSI, USB, IEEE1394 и т. д.), может случиться, что два или более устройств имеют один и тот же адрес шины, поэтому требуется некоторый способ отличать эти устройства. Уровень HAL предоставляет службу для идентифика­ции устройств, отображая адреса устройств на шине на логические системные адреса. Поэтому драйверам не нужно следить за тем, которое устройство находит­ся на какой шине. Такая логическая адресация аналогична дескрипторам, выдава­емым операционной системой программам пользователя для обращения к файлам и другим системным ресурсам. Этот механизм также защищает более высокие уровни от свойств структур шин и соглашений об адресации.

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

Другая служба HAL занимается управлением операциями DMA независимым от устройств способом. HAL может управлять как единым для всей системы меха­низмом DMA, так и механизмами DMA, специфичными для конкретных плат вво­да-вывода. Обращение к устройствам осуществляется по их логическим адресам.

Уровень HAL также реализует программные операции чтения/записи с разнесе­нием данных (с обращением к не являющимся соседними блокам памяти).

Уровень HAL управляет часами и таймерами, обеспечивая переносимость работающих с ними программ. Время хранится в интервалах по 100 нc, что существенно точнее, чем то, как это делалось в MS-DOS в 2-секундных интервалах. Временные службы уровня HAL обеспечивают независимость драйверов от фактических частот, на которых работают часы.

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

Наконец, после загрузки операционной системы уровень HAL общается с BIOS и инспектирует память конфигурации CMOS, если она используется, чтобы определить, какие шины и устройства ввода-вывода содержатся в системе и как их следует настроить. Затем эта информация помещается в реестр, чтобы другие компоненты системы могли просматривать их, не обращаясь напрямую к BIOS или CMOS-памяти.

Поскольку уровень HAL является в большой степени машинно-зависимым, он должен в совершенстве соответствовать системе, на которой установлен, поэтому набор различных уровней HAL поставляется на компакт-диске Windows 2000. Во время установки системы из них выбирается подходящий уровень и копируется на жесткий диск в системный каталог \winnt\system32 в виде файла hal.dll. При всех последующих загрузках операционной системы используется эта версия уровня HAL. Если удалить этот файл, то система загрузиться не сможет.

Хотя эффективность уровня HAL является довольно высокой, для мульти­медийных приложений ее может быть недостаточно. По этой причине корпора­ция Microsoft также производит пакет программного обеспечения, называемый DirectX, расширяющий функциональность уровня HAL дополнительными про­цедурами и предоставляющий пользовательским процессам прямой доступ к ап­паратному обеспечению.

Над уровнем аппаратных абстракций располагается уровень, содержащий то, что корпорация Microsoft называет ядром, а также драйверы устройств. Начиная с NT 4.0, практически вся операционная система была помещена в пространство ядра. При описании операционной системе UNIX термин «ядро» используется для обозначения всего, что работает в режиме ядра. В данном разделе все программное обеспечение, работающее в режиме ядра, будем называть «операционной системой».

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

Назначение ядра заключается в том, чтобы сделать всю остальную часть опера­ционной системы независимой от аппаратуры и, таким образом, легко переноси­мой на другие платформы. Оно начинается там, где заканчивается уровень HAL. Ядро получает доступ к аппаратуре через уровень HAL. Оно построено на чрезвы­чайно низкоуровневых службах уровня HAL, формируя из них абстракции более высоких уровней. Например, у уровня HAL есть вызовы для связывания процедур обработки прерываний с прерываниями и установки их приоритетов, но больше практически ничего уровень HAL в этой области не делает. Ядро, напротив, предо­ставляет полный механизм для переключения контекста. Оно должным образом сохраняет все регистры центрального процессора, изменяет таблицы страниц, со­храняет кэш центрального процессора и т. д. Когда все эти действия выполнены, работавший ранее поток оказывается полностью сохраненным в таблицах, распо­ложенных в памяти. Затем ядро настраивает карту памяти нового потока и загру­жает его регистры, после чего новый поток готов к работе.

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

Помимо предоставления абстрактной модели аппаратуры более высоким уровням и управления переключениями потоков, ядро также выполняет еще одну ключевую функцию: предоставляет низко-уровневую поддержку двум классам объектов – управляющим объектам и объектам диспетчеризации. Эти объекты не являются объектами, к которым пользовательские процессы получают дескрип­торы, но представляют собой внутренние объекты, на основе которых исполняю­щая система строит объекты пользователя.

Управляющие объекты – это объекты, управляющие системой, включая при­митивные объекты процессов, объекты прерываний и два объекта, называемых DPC и АРС. Объект DPC (Deferred Procedure Call – отло­женный вызов процедуры) используется, чтобы отделить часть процедуры обра­ботки прерываний, для которой время является критичным, от той ее части, для которой время некритично. Как правило, процедура обработки прерываний сохра­няет несколько аппаратных регистров, связанных с прерывающим устройством ввода-вывода, чтобы их можно было потом восстановить, и разрешает аппаратуре продолжать работу, но оставляет большую часть обработки на потом. Например, когда пользователь нажимает на клавишу, процедура обработки прерываний от клавиатуры считывает из регистра код нажатой клавиши и разреша­ет прерывания от клавиатуры. Но эта процедура не должна немедленно обрабаты­вать введенный символ, особенно если в данный момент происходит нечто более важное (то есть нечто с более высоким приоритетом). Пока обработка клавиши за­нимает не более 100 мс, пользователь ничего не заметит. Отложенные вызовы про­цедуры также применяются для слежения за таймерами и другой активностью, для которой не требуется немедленная обработка. Очередь DPC представляет собой механизм напоминания о том, что есть работа, которую следует выполнить позднее.

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

Еще один тип объектов ядра – объекты диспетчеризации. К ним относятся семафоры, мьютексы, события, таймеры и другие объекты, изменения состояния которых могут ждать потоки. Причина, по которой они должны обра­батываться ядром, заключается в том, что они тесно переплетены с планированием потоков, что входит в круг задач ядра.

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

Менеджер объектов управляет всеми объектами, известными операционной системе. К ним относятся процессы, потоки, файлы, каталоги, семафоры, устрой­ства ввода-вывода, таймеры и многое другое. При создании объекта менеджер объектов получает в адресном пространстве ядра блок виртуальной памяти и воз­вращает этот блок в список свободных блоков, когда объект уничтожается. Его работа заключается в том, чтобы следить за всеми объектами. Отметим, что большинство компонентов исполня­ющей системы не являются процесса­ми или потоками, а представляют собой просто набор процедур, которые могут выполняться другими потоками в режиме ядра. Однако некоторые из них, такие как менеджер питания и менеджер plug-and-play, являются настоящими потоками. Менеджер объектов также управляет пространством имен, в которое помеща­ется созданный объект, чтобы впоследствии к нему можно было обратиться по имени. Все остальные компоненты исполняющей системы активно пользуются объектами во время своей работы. Объекты занимают центральное место в функ­ционировании операционной системы Windows 2000.

Менеджер ввода-вывода формирует каркас для управления устройствами ввода-вывода и предоставляет общие службы ввода-вывода. Он предоставляет остальной части системы независимый от устройств ввод-вывод, вызывая для выполнения физического ввода-вывода соответствующий драйвер. Здесь также располагаются все драйверы устройств. Файловые системы формально являются драйверами устройств под управлением менеджера ввода-вывода. Существует два драйвера для файловых систем FAT и NTFS, независимые друг от друга и управляющие различными разделами диска. Все файловые системы FAT управляются одним драйвером. (Ввод-вывод будет рассмотрен далее в подразделе «Ввод-вывод в Windows 2000», а файловая система NTFS – в подразделе «Файловая система Windows 2000»).

Менеджер процессов управляет процессами и потоками, включая их созда­ние и завершение. Он занимается не стратегиями, применяемыми по отношению к процессам, а механизмом, используемым для управления ими. Менеджер про­цессов основывается на объектах потоков и процессов ядра и добавляет к ним до­полнительные функции. Это ключевой элемент многозадачности в Windows 2000. Управление процессами будет рассматриваться далее в подразделе «Процессы и потоки в Windows 2000».

Менеджер памяти реализует архитектуру виртуальной памяти со страничной подкачкой по требованию операционной системы Windows 2000. Он управляет преобразованием виртуальных страниц в физические страничные блоки. Таким образом, он реализует правила защиты, ограничивающие доступ каждого про­цесса только теми страницами, которые принадлежат его адресному пространству, а не адресным пространствам других процессов (кроме специальных случаев). Он также контролирует определенные системные вызовы, относящиеся к вирту­альной памяти. Управление памятью будет рассматриваться в подразделе «Управле­ние памятью».

Менеджер безопасности приводит в исполнение сложный механизм без­опасности Windows 2000, удовлетворяющий требованиям класса С2 Оранжевой книги Министерства обороны США. В Оранжевой книге перечислено множество правил, которые должна соблюдать система, начиная с аутентификации при реги­страции и заканчивая управлением доступом, а также обнулением страниц перед их повторным использованием. Менеджер безопасности будет обсуждаться в подраз­деле «Безопасность в Windows 2000».

Менеджер кэша хранит в памяти блоки диска, которые использовались в по­следнее время, чтобы ускорить доступ к ним в случае, если они понадобятся вновь. Его работа состоит в том, чтобы определить, какие блоки понадобятся снова, а ка­кие нет. Операционная система Windows 2000 может одновременно использовать несколько файловых систем. В этом случае менеджер кэша обслуживает все фай­ловые системы, таким образом, каждой файловой системе не нужно заниматься управлением собственного кэша. Когда требуется блок, он запрашивается у менед­жера кэша. Если у менеджера кэша нет блока, он обращается за блоком к соответ­ствующей файловой системе. Поскольку файлы могут отображаться в адресное пространство процессов, менеджер кэша должен взаимодействовать с менеджером виртуальной памяти, чтобы обеспечить требуемую непротиворечивость. Количе­ство памяти, выделенной для кэша, динамически изменяется и может увеличивать­ся или уменьшаться при необходимости. Менеджер кэша будет описан в подразделе «Кэширование в Windows 2000».

Менеджер plug-and-play получает все уведомления об установленных новых устройствах. Для некоторых устройств проверка производится при загрузке сис­темы, но не после нее. Другие устройства, например устройства USB (Universal Serial Bus – универсальная последовательная шина), могут подключаться в лю­бое время, и их подключение запускает пересылку сообщения менеджеру plug-and-play, который затем находит и загружает соответствующий драйвер.

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

Менеджер конфигурации отвечает за состояние реестра. Он добавляет новые записи и ищет запрашиваемые ключи.

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

Исполняющий модуль Win32 GDI обрабатывает определенные системные вызовы (но не все). Изначально он располагался в пространстве пользователя, но в версии NT 4.0 для увеличения производительности был перенесен в простран­ство ядра. Интерфейс графических устройств GDI (Graphic Device Interface) за­нимается управлением графическими изображениями для монитора и принтеров. Он предоставляет системные вызовы, позволяющие пользовательским програм­мам выводить данные на монитор и принтеры независящим от устройств спосо­бом. Он также содержит оконный менеджер и драйвер дисплея. До версии NT 4.0 интерфейс графических устройств также находился в пространстве пользователя, но производительность при этом оставляла желать лучшего, поэтому корпорация Microsoft переместила его в ядро.

Над исполняющей системой размещается уровень, называемый систем­ными службами. Его функции заключаются в предоставлении интерфейса к ис­полняющей системе. Он принимает настоящие системные вызовы Windows 2000 и вызывает другие части исполняющей системы для их выполнения.

При загрузке операционная система Windows 2000 загружается в память как набор файлов. Основная часть операционной системы, состоящая из ядра и ис­полняющей системы, хранится в файле ntoskrnl.exe. Уровень HAL представляет собой библиотеку общего доступа, расположенную в отдельном файле hal.dll. Интерфейс Win32 и интерфейс графических устройств хранятся вместе в тре­тьем файле – win32k.sys. Кроме этого, загружается множество драйверов устройств, у большинства которых расширение sys. Существует две версии файла ntoskrnl.exe: для однопроцессорных и многопроцессорных систем. Также существуют версии для процессора Хеоn, способного поддерживать более 4 Гбайт физичес­кой памяти, и для процессора Pentium, который так много оперативной памяти поддержать не может. Наконец, этот модуль может содержать или не содержать отладочные функции, предназначенные для отлад­ки системы.

Каждый из драйверов устройств могут управлять одним или несколькими устройствами ввода-вывода, но драйвер устройства может также выполнять действия, не относящиеся к какому-либо специфическому устройству – шифровать поток данных или даже просто предоставлять доступ к структурам данных ядра. Драйверы устройств не являются частью двоичного файла ntoskrnl.exe. Преимущество такого подхода заключается в том, что как только драйвер устанавливается в систему, он добавляется в реестр и затем динамически загружается при каждой загрузке системы. Таким образом, файл ntoskrnl.exe остается одинаковым для всех конфигураций систем, но каждая система точно настраивается на конфигурацию аппаратуры.

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

Реализация объектов

 

Объекты представляют собой, вероятно, самое важное понятие операционной си­стемы Windows 2000. Они предоставляют однородный и непротиворечивый ин­терфейс ко всем системным ресурсам и структурам данных, таким как процессы, потоки, семафоры и т. д. У этой однородности есть много граней. Во-первых, все объекты именуются по одной и той же схеме. Доступ ко всем объектам также пре­доставляется одинаково, при помощи дескрипторов объектов. Во-вторых, посколь­ку доступ к объектам всегда осуществляется через менеджер объектов, все провер­ки, связанные с защитой, могут быть размещены в одном месте, с гарантией, что ни один процесс не сможет обойти их. В-третьих, возможно совместное исполь­зование объектов по одной и той же схеме. В-четвертых, поскольку все объекты открываются и закрываются через менеджер объектов, несложно отследить, ка­кие объекты все еще используются, а какие можно безопасно удалить. В-пятых, эта однородная модель для управления объектов позволяет легко регулировать квоты ресурсов.

 

Ключом к пониманию объектов является тот факт, что исполняемый объект представляет собой просто набор последовательных слов в памяти (то есть в вир­туальном адресном пространстве ядра). Объект представляет собой структуру дан­ных в памяти. Файл на диске не является объектом, хотя для файла при его открытии создается объект (то есть структура данных в вирту­альном адресном пространстве ядра). Из того факта, что объекты представляют собой всего лишь структуры данных в виртуальном адресном пространстве ядра, следует, что при перезагрузке (или сбое) системы все объекты теряются. Дей­ствительно, когда операционная система загружается, нет никаких объектов (кро­ме бездействующих системных процессов, чьи объекты жестко прошиты в файле ntoskrnl.exe). Все остальные объекты создаются на ходу при загрузке системы и во время работы различных программ инициализации, а позднее пользовательских программ.

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

Каждый заголовок объекта также содержит поле цены квоты, представляющей собой плату, взимаемую с процесса за открытие объекта. Если файловый объект стоит один пункт, а процесс принадлежит к заданию, у которого есть 10 пунктов квоты, то суммарно все процессы этого задания могут открыть не более 10 фай­лов. Таким образом, для объектов каждого типа могут реализовываться ограниче­ния на ресурсы.

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





Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.201.3.10 (0.02 с.)