40. Структура api ядра ос Windows: Kernel api, Windowing api, Messaging api. Функции ZwXxx/NtXxx в пользовательском режиме и в режиме ядра.
Ядро состоит из следующих компонентов:
Исполнительная система ( Executive ) - управление памятью, процессами и потоками;
Ядро ( Kernel ) - планирование потоков, диспетчеризация прерываний и исключений и др. (реализовано в Ntoskrnl . exe);
Драйверы устройств ( Device Drivers ) - драйверы аппаратных устройств, сетевые драйверы, драйверы файловых систем;
Уровень абстрагирования от оборудования ( Hardware Abstraction Layer , HAL) - изолирует три вышеперечисленных компонента от различий между аппаратными архитектурами (реализован в Hal.dll );
Подсистема поддержки окон и графики ( Windowing And Graphics System ) - функции графического пользовательского интерфейса ( Graphic User Interface , GUI) (реализована в Win32k.sys ).
Ядро ( Kernel ) работает в тесном контакте с уровнем аппаратных абстракций. Этот модуль занимается планированием действий компьютерного процессора. В случае если компьютер содержит несколько процессоров, ядро синхронизирует их работу с целью достижения максимальной производительности системы. Ядро осуществляет диспетчеризацию нитей управления ( threads ) таким образом, чтобы максимально загрузить процессоры системы и обеспечить первоочередную обработку нитей с более высоким приоритетом.
Исполняющая система ( Executive ), в состав которой входит ядро и уровень аппаратных абстракций HAL, обеспечивает общий сервис системы, который могут использовать все подсистемы среды. Каждая группа сервиса находится под управлением одной из отдельных составляющих исполняющей системы: диспетчера объектов ( Object Manager ) диспетчера виртуальной памяти ( Virtual Memory Manager ); диспетчера процессов ( Process Manager ) средства вызова локальных процедур ( Local Procedure Call Facility ); диспетчера ввода - вывода (E/O Maneger ); мониторы безопасности ( Security Reference Monitor ). Монитор безопасности совместно с процессором входа в сиситему ( Logon ) и защищёнными подсистемами реализует модель безопасности Windows NT. Верхний уровень исполняющей системы называется системным сервисом ( System Services ).
Native API для Windows NT является средством, которое реализует контролируемый вызов системных сервисов, исполняемых в режиме ядра. Этот интерфейс API является интерфейсом системных вызовов и не предназначается для непосредственного использования пользовательскими программами, кроме того, его документация ограничена. Native API предоставляется коду пользовательского режима библиотекой ntdll.dll . Библиотека ntdll.dll, имеющая точки входа в Native API для кода пользовательского режима, содержит также код загрузки модуля и запуска потока процесса. Однако большинство входов в Native API являются заглушками, которые просто передают управление режиму ядра.
Все функции прикладного уровня, вызывающие это прерывание, сосредоточены в модуле ntdll.dll и имеют в своем названии префикс Nt либо Zw , например, NtCreateFile ()/ ZwCreateFile (). Точка входа для двух таких имен одна. Вызов многих функций различных подсистем рано или поздно приведет к вызову соответствующей функции из ntdll.dll. При этом не все, что есть в ntdll.dll вызывается из подсистемы Win32.
Вызов системных сервисов возможен не только из прикладной программы, но и из ядра ОС, то есть из драйверов. Имена соответствующих функций ядра имеют префикс либо Zw , либо Nt ( ZwCreateFile (), NtCreateFile ()). Функции с префиксом Zw обращаются к сервисам посредством прерывания 2Е, тогда как функции с префиксом Nt являются собственно точками входа стандартных системных сервисов. Из этого следует, что число функций с префиксом Nt неизменно, а множество этих функций является подмножеством функций с префиксом Zw .
41. Переход из пользовательского режима в режим ядра. Таблицы описателей функций ОС Windows. Диспетчеризация вызова Kernel API и Windowing+ Messaging API. Понятие UI-потока.
Прикладные программы могут переключаться из пользовательского режима в режим ядра, обращаясь к системному сервису. Например, Windows-функции ReadFile в ходе своего выполнения приходится вызывать внутреннюю подпрограмму Windows — она то и считывает данные из файла. Так как эта подпрограмма обращается к внутрисистемным структурам данных, она должна выполняться в режиме ядра. Переключение из пользовательского режима в режим ядра осуществляется специальной командой процессора. Операционная система перехватывает эту команду, обнаруживает запрос системного сервиса, проверяет аргументы, которые поток передал системной функции, и выполняет внутреннюю подпрограмму. Перед возвратом управления пользовательскому потоку процессор переключается обратно в пользовательский режим. Благодаря этому операционная система защищает себя и свои данные от возможной модификации пользовательскими процессами. Так что ситуация, когда пользовательский поток часть своего времени работает в пользовательском режиме, а часть — в режиме ядра, совершенно нормальна.
Все функции, создающие объекты ядра, возвращают описатели, которые привязаны к конкретному процессу и могут быть использованы в любом потоке данного процесса Значение описателя представляет собой индекс в таблице описателей, принадлежащей процессу, и таким образом идентифицирует место, где хранится информация, связанная с объектом ядра. Всякий раз, когда Вы вызываете функцию, принимающую описатель объекта ядра как аргумент, Вы передаете ей значение, возвращенное одной из Create-функций. При этом функция смотрит в таблицу описателей, принадлежащую Вашему процессу, и считывает адрес нужного объекта ядра. Если Вы передаете неверный индекс (описатель), функция завершается с ошибкой и GetLastError возвращает 6 (ERROR_INVALID_HANDLE). Это связано с тем, что на самом деле описатели представляют собой индексы в таблице, их значения привязаны к конкретному процессу и недейовительны в других процессах.
Потоки пользовательского режима классифицируются в ядре как потоки, имеющие пользовательский интерфейс(UI-потоки) и не имеющие его (non UI-потоки). Non UI-поток становится UI автоматически, как только делает вызов функции Windowing или Messaging API.
UI-потоки:
Имеют стек > 12 кбайт (увеличение переменной, хранящей максимальный размер стека)
Драйвер Win32K.sys отслеживает все такие потоки (это драйвер виртуального устройства, видеосистемы)
Содержат указатели на переменную KeServiceDescripterTableShadow, эта переменная содержит указатель на массив из четырех таблиц указателей на функции обработки сервисов, 2-ой элемент этого массива – таблица дескрипторов, указывающих на функции в библиотеке драйвера Win32k.sys.
- Модель программного интерфейса ос windows. Понятие объекта ядра и описателя объекта ядра операционной системы Windows. Нотация программного интерфейса.
- Понятие пользовательского режима и режима ядра операционной системы Windows. Модель виртуальной памяти процесса в пользовательском режиме и в режиме ядра операционной системы Windows.
- Обзор архитектуры и основных модулей операционной системы Windows.
- Системный реестр операционной системы Windows.
- 5. Основные элементы программ с оконным пользовательским интерфейсом. Минимальная программа для ос Windows с окном на экране. Создание и отображение окна.
- Понятие оконного сообщения. Источники сообщений. Очередь сообщений. Цикл приема и обработки сообщений. Процедура обработки сообщений.
- 8. Вывод информации в окно. Механизм перерисовки окна.
- 9. Принципы построения графической подсистемы ос Windows. Понятие контекста устройства. Вывод графической информации на физическое устройство.
- 10. Рисование геометрических фигур. Графические инструменты. Управление цветом. Палитры цветов.
- 11. Растровые изображения. Вывод растровых изображений. Значки и курсоры. Вывод растровых изображений с эффектом прозрачного фона.
- 12. Вывод текста. Логические и физические шрифты.
- 13. Системы координат. Трансформации. Режимы масштабирования.
- 14. Понятие ресурсов программ. Виды ресурсов. Работа с ресурсами. Меню. Окна диалога.
- 15. Понятие динамически подключаемой библиотеки. Структура dll-библиотеки. Создание dll-библиотеки. Использование dll-библиотеки в программе. Статический и динамический импорт.
- 16. Отображение файлов в память.
- 17. Организация многозадачности в операционной системе Windows. Понятие процесса и потока. Контекст потока. Создание и завершение процессов и потоков.
- 18. Механизм приоритетов в операционной системе Windows. Класс приоритета процесса. Относительный приоритет потока. Базовый и динамический приоритеты потока.
- 19. Синхронизация потоков в пределах одного процесса. Критические секции. Спин-блокировки. Interlocked-функции.
- 20. Синхронизация потоков разных процессов. Объекты синхронизации: флаги, семафоры, события, ожидаемые таймеры, именованные и неименованные «трубы» (каналы).
- 21. Синхронизация потоков при создании общих данных с помощью двойных проверок (double-checked locking).
- 22. Синхронизация потоков с помощью мониторов Хоара.
- 24. Структуры данных общего назначения в режиме ядра. Представление строк стандарта Unicode. Представление двусвязных списков.
- 25. Понятие прерывания, исключения и системного вызова.
- 26. Аппаратные и программные прерывания. Таблица обработчиков прерываний. Понятие процедуры обработки прерываний (isr).
- 27. Программируемый контролер прерываний. Уровни прерываний. Механизм вызова прерываний. Функция KeBugCheckEx.
- 28. Исключения. Механизм обработки исключения.
- 29. Системные вызовы. Выполнение системного вызова.
- 30. Понятие отложенной процедуры (dpc). Назначение отложенных процедур.
- 31. Понятие асинхронной процедуры (apc). Назначение асинхронных процедур. Асинхронные процедуры режима ядра и пользовательского режима.
- 32. Понятие рабочего элемента ядра (Work Item). Назначение рабочих элементов.
- 33. Пулы памяти. Пул подкачиваемой памяти, пул неподкачиваемой памяти, пул сессии, особый пул. Тегирование пулов. Структура данных пула.
- 34. Оптимизация использования оперативной памяти с помощью списков предыстории (look-aside lists).
- 35. Блокирование страниц в памяти. Списки описателей памяти (mdl) и их использование
- 36. Представление объекта ядра в памяти. Менеджер объектов.
- 37. Структура драйвера операционной системы Windows. Точки входа в драйвер.
- 38. Объект, описывающий драйвер. Объект, описывающий устройство. Объект, описывающий файл. Взаимосвязь объектов.
- 39. Запрос ввода-вывода (irp). Схема выполнения ввода-вывода в стеке драйверов.
- 40. Структура api ядра ос Windows: Kernel api, Windowing api, Messaging api. Функции ZwXxx/NtXxx в пользовательском режиме и в режиме ядра.
- 42. Перехват функций ос Windows api в пользовательском режиме. Интерфейсный модуль ntdll.Dll.
- 43. Перехват вызова функций ос Windows в режиме ядра. Встроенная защита от перехвата в новейших версиях ос Windows.