
- •Тема 8. Интерфейсы операционных систем
- •8.1.Интерфейс прикладного программирования
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1.Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1.Основные определения
- •8.1.1.Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1.1. Основные определения
- •8.1. Интерфейс прикладного программирования
- •8.1.2. Классификация системных вызовов
- •Основные функции управления синхронизацией
- •Основные функции управления виртуальной и физической памятью
- •Основные функции управления виртуальной и физической памятью
- •Функции механизма отображения файла в память
- •Основные функции для файлового ввода-вывода
- •Основные функции управления каталогами
- •Некоторые категории вызовов GUI
- •Основные функции управления защитой
- •Основные функции управления реестром
- •Основные функции управления консолью
- •8.1.Интерфейс прикладного программирования
- •8.1.3. Программирование системных вызовов
- •8.1.3.Программирование системных вызовов
- •8.1.3. Программирование системных вызовов
- •8.1.3. Программирование системных вызовов
- •8.1.3.Программирование системных вызовов
- •8.1.3.Программирование системных вызовов
- •8.1.Интерфейс прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •Способы реализации ИПП
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.1.4. Реализация интерфейса прикладного программирования
- •На рис. позицией 1 обозначен вызов обработчика ловушки и диспетчера базовых сервисов. Позиции
- •8.1.4. Реализация интерфейса прикладного программирования
- •8.2. Интерфейс пользователя
- •8.2.1.Типы интерфейсов
- •8.2.1. Типы интерфейсов
- •8.2.1.Типы интерфейсов
- •8.2.1. Типы интерфейсов
- •8.2.1. Типы интерфейсов
- •8.2.1.Типы интерфейсов
- •8.2.1. Типы интерфейсов
- •8.2.Интерфейс пользователя
- •8.2.2.Консоль
- •8.2.2. Консоль
- •8.2.2. Консоль
- •8.2.2. Консоль
- •8.2.2. Консоль
- •8.2.2.Консоль
- •8.2.Интерфейс пользователя
- •8.2.3. Графическая среда
- •8.2.3. Графическая среда
- •8.2.3. Графическая среда
- •8.2.3. Графическая среда
- •8.2.Интерфейс пользователя
- •8.2.Интерфейс пользователя
- •8.2.Интерфейс пользователя
- •8.2.5. Архитектура, управляемая событиями
- •8.2.5. Архитектура, управляемая событиями
- •8.2.5. Архитектура, управляемая событиями
- •8.2.5. Архитектура, управляемая событиями

8.1.4. Реализация интерфейса прикладного программирования
Динамическое связывание в процессе выполнения.
Осуществим динамическую загрузку библиотеки Graph3D.dll в оперативную память, после чего получим адрес функции Ellipse3D() в памяти:
•hLibrary = LoadLibrary («GDI32.DLL»);
•pfnEUipse3D = (PFNELL3D) GetProcAddress (hLibrary, « Ellipse3D»); Функция LoadLibrary() возвращает NULL, если библиотеку не
удается загрузить. Теперь можно вызывать функцию по ее адресу:
• pfnEUipse3D (hdc, x1, y1, x2, y2);
Если библиотека больше не нужна, можно освободить занимаемую ею память:
• Free Library (hLibrary);
61

8.1.4. Реализация интерфейса прикладного программирования
Динамическое связывание в процессе выполнения.
Особенности использование DLL-библиотек в Windows:
1.Поскольку функции DLL-библиотеки выполняются в контексте процесса, то все, что делает динамически подключаемая библиотека, делается от имени процесса. Например, память, запрашиваемая библиотекой, выделяется в адресном пространстве процесса, все создаваемые библиотекой окна и открываемые файлы принадлежат приложению.
2.Несколько приложений одновременно могут использовать одну и ту же динамически подключаемую библиотеку. Это не приводит к нарушению безопасности, так как код функций библиотеки защищен от записи, а данные, с которыми работает DLL, для каждого процесса свои.
62

8.1.4. Реализация интерфейса прикладного программирования
Вызовы системных сервисов.
К числу функций ИПП, выполняющихся в контексте вызывающего процесса, но с переключением в режим ядра, относятся прежде всего базовые функции операционной системы, или по-другому -системные сервисы.
Если требуется использование команд:
•изменяющих состояние системных регистров,
•осуществляющих взаимодействие с портами ввода-вывода,
•воздействующих на механизм защиты и т. д.,
то такую работу могут выполнить только базовые системные сервисы. Связано это с тем, что такие команды являются привилегированными, а выполнение привилегированных команд разрешено только в режиме ядра (супервизора).
Изменение данных, принадлежащих операционной системе, также разрешено только программам режима ядра.
Никакая программа пользовательского режима не может изменить содержимое памяти операционной системы, если страница этой памяти
имеет режим «супервизор» или защищена от записи. |
|
|
Так как ограничения защиты |
не распространяются на ОС, то |
|
вызываемые функции должны |
выполняться в режиме ядра и, |
|
естественно, принадлежать операционной системе. |
63 |
|
|

8.1.4. Реализация интерфейса прикладного программирования
Способы реализации ИПП (см. рис. далее):
1. Выполнение функции стандартной библиотеки системы программирования без вызова системных функций (рис. 10, позиция 1).
2.Выполнение системной функции API Win32 без вызова базовых функций ОС (позиция 2).
3.Выполнение нескольких функций DLL-библиотек для реализации системного вызова без вызова базовых функций ОС (позиция 3).
4. Выполнение системного вызова с обращением из DLL-функции (заглушки) к системному сервису. Вызов системного сервиса осуществляется через программное прерывание (позиция 4).
5. Вызов базовой функции ОС через прерывание непосредственно из программы, минуя заглушку (позиция 8).
Способы 1-3 были рассмотрены выше. Такие функции никак не связаны с базовыми сервисами ОС.
64

Способы реализации ИПП
65

8.1.4. Реализация интерфейса прикладного программирования
Вызовы системных сервисов.
Для того чтобы вызов функции режима ядра из пользовательского режима был безопасным, необходимо, чтобы программы могли вызывать только строго определенные функции и не могли управлять точками входа в эти функции.
Кроме того, необходимо, чтобы после вызова базовой функции программа не могла изменить значения передаваемых параметров. Практически во всех ОС перечисленные требования реализуются вызовом базовых сервисов с помощью программного прерывания (позиции 5 и 8 на рисунке выше).
Механизм прерываний выполняет следующую последовательность действий:
•программа, выдавшая запрос на прерывание, теряет управление;
• |
осуществляется переключение режима «пользователь» на режим |
|
«ядро»; |
•происходит переключение с пользовательского стека на стек ядра;
• |
выполняется копирование параметров из стека пользовательского |
||
• |
режима в стек ОС; |
|
|
из таблицы прерываний (IDT) выбирается адрес точки входа в |
|||
• |
обработчик прерывания; |
66 |
|
осуществляется передача управления в обработчик. |
|||
|

8.1.4. Реализация интерфейса прикладного программирования
Вызовы системных сервисов.
Этот процесс является безопасным, так как программа не может изменить таблицу прерываний в силу того, что она находится в защищенной памяти, а после смены режима управлением уже владеет ОС, которая никогда не предоставит свои привилегии прикладной программе. Обратный процесс смены режима реализуется без прерывания, по команде iret (позиция 7 на пред. рис.).
В Windows упомянутое выше прерывание называется ловушкой. Поскольку количество базовых функций может быть весьма велико,
то на все функции, как правило, не хватает векторов (дескрипторов в IDT) программных прерываний.
Поэтому часто используется один или несколько, обработчики которых выполняют роль диспетчеров базовых функций.
Так, в современных ОС Windows все базовые функции вызываются командой int 2Eh (позиция 5 на пред. Рис.). С этим прерыванием связан обработчик ловушек, который содержит диспетчер системных сервисов. Диспетчер по номеру функции, используя таблицу распределения базовых функций, вызывает требуемый сервис (позиция 6 на пред. рис.).
67

8.1.4. Реализация интерфейса прикладного программирования
Вызовы системных сервисов.
Прикладной программе Windows не запрещено вызвать с помощью прерывания системный сервис, не задействуя при этом посредников в виде функций DLL-библиотек (позиция 8 на пред. Рис.).
В MS DOS нельзя обойтись без вызова системных сервисов через прерывание. В этой операционной системе не используется аппарат динамического связывания, поэтому вызов всех системных сервисов осуществляется через соответствующие программные прерывания.
Например, наиболее распространенным является прерывание int 21h, которое является диспетчером основных функций.
Другим диспетчером является видеодрайвер BIOS, вызываемый через int 10h.
Перед выполнением указанных прерываний в регистр АН должен быть загружен номер вызываемой функции, а в другие регистры - параметры.
Windows не разрешает MS DOS самой выполнять системные сервисы, поэтому Windows перехватывает прерывания MS DOS и сама выполняет требуемые функции.
68

8.1.4. Реализация интерфейса прикладного программирования
Заглушки.
В современных ОС системные сервисы, как правило, не документируются, так как они в основном вызываются промежуточными функциями, называемыми заглушками (позиция 4 на пред. Рис.).
Заглушки являются функциями DLL-библиотек. Имена системных функций и являются именами заглушек.
Применение заглушек решает несколько задач:
1. Заглушки, с одной стороны, являются посредниками между документируемым стандартом API Win32 и частной реализацией системных сервисов - с другой стороны. Так, базовый уровень в Windows 95/98 и в системах Windows, разработанных по технологии NT, реализован по-разному. Однако на уровне API эти операционные системы совместимы.
2.Заглушки могут выполнять ту часть работы, которую системные сервисы могут вынести на уровень режима «пользователь».
3.Заглушки выполняют проверки параметров на их совместимость, непротиворечивость и безопасность.
4.Заглушки выполняют упаковку параметров перед вызовом базового
сервиса. |
69 |
|

8.1.4. Реализация интерфейса прикладного программирования
Заглушки.
Системные сервисы не должны считать, что параметры проверены заглушкой и безопасны.
Проверки, выполняемые заглушками, полезны для другого вида реализации интерфейса, а именно для выполнения системных функций в другом процессе, в частности, защищенной подсистемой Win32.
70