Ядро Windows NT
Ядро Windows NT
Упрощенная схема ядра Windows NT
Продолжаем начатую лекцию по ОС Windows NT. Начало лекции можно посмотреть здесь.
Само ядро представим в виде трех слоев.
Ядро должно быть по максимуму переносимым, ибо аппаратное обеспечение может меняться и каждый раз менять код ядра это трудоемко. Поэтому нужно сделать универсальную часть и часть специфичную для оборудования — небольшую, которую можно будет легко менять и которая бы предоставляла унифицированный интерфейс ядру и драйверам.
Это и спроектировали в HAL.
На рисунке ниже представлена упращенная схема ядра Windоws NT.
В то время, когда проектировался сам Windows это было необходимостью, ведь не было понятно, какой доминирующей будет аппаратная платформа через год, 5лет…, а ОС должна ориентироваться на текущее и будущее аппаратное обеспечение. Тогда не был ясен тип платформы (х86 х64), и только благодаря свойству переносимости удалось выпустить Windows ARTI для планшетов (на базе ЦП ARM).
Таким образом запроектировано переносимое портабельное ядро с помощью слоя абстракции аппаратного обеспечения (HAL).
На этом слое абстракции стоят следующие две части ядра:
- Драйвера устройств – они работают с устройствами через HAL и предоставляют свои сервисы, например устройства ввода/вывода – мышь, клавиатура, диск, сеть.
- Kernel – это не конкретно ядро, а его часть.
Ключевой принцип архитектуры ядра Windows
Это принцип подсистем окружения (или персоналий).
Программы пользователя НЕ используют сервисы ОС напрямую. Даже когда мы запускаем любое приложение под Windows напрямую, оно никогда не использует ядро напрямую, только через подсистему окружения Windows API, нет вызова ядра напрямую.
Библиотека подсистемы неким образом транслирует документированную API функцию в вызов недокументированной функции ОС.
За счет этого функции ОС можно менять под «сегодняшний» день, при этом оставлять обратную совместимость с теми приложениями, которые уже разработаны под ОС, за счет того, что есть документированное API, которое обязано работать.
Вначале было три подсистемы окружения: Windows, OS/2, POSIX
В Windows 2000 исчезла OS/2
В Windows XP исчезла POSIX
Компоненты системы ядра
Kernel – самые низкоуровневые функции ОС: планирование потоков, обработка прерываний, мультипроцессорная синхронизация.
Kernel предоставляет низкоуровневые примитивы, на которые Executive реализует высокоуровневые конструкции
HAL – прослойка между аппаратным обеспечением и ядром.
Executive – стоит выше и реализует основные сервисы ОС: управление памятью, процессами, потоками, безопасность, ввод/вывод, межпроцессорное взаимодействие.
Драйвера устройств – реальные устройства – работа с аппаратурой, виртуальные устройства – драйвера (например сетевого стэка).
Другие модули ядра
- Реализуют функции графического интерфейса
- Реализуют оконную подсистему
Микроядро
В классическом понимании ядро Windows далеко не микроядро, так как нет защиты между компонентами ОС, они не работают в изолированных адресных пространствах, не работают в других режимах, а только в режиме ядра.
Причины: производительность, слишком много переключений. По мнению MS нет ни одной коммерчески успешной ОС, которая была бы исключительно микроядро.
В Windows используется Гибридное ядро, так как обладает некоторыми характеристиками микроядра:
- Подсистемы(персоналии) работают в собственных адресных пространствах
- Компоненты ядра архитектурно изолированы, т.е. менеджер памяти, в его внутреннюю структуру из вне никто не вторгается, все пользуются тем API, которое предоставляет ММ. Тоже самое касается управлением процессами, потоками, конфигурациями, они архитектурно изолированы.
На рисунке выше «Упрощенная схема ядра» Kernel по сути и есть это микроядро, которое можно было бы Executive вынести в режим пользователя и разбить его на отдельные процессы. В ядре осталась бы только часть и это было бы классическое микроядро.
Но из за причины производительности Executive не стали выносить в режим пользователя и разбивать на отдельные процессы. Его скомпилировали, поместили в модуль, архитектурно все осталось в ядре.
Поэтому В Windows ядро Гибридное и достаточно интересно организовано.
Переносимость (портируемость) — это ключевая особенность ОС Windows.
Код ядра написан на языке высокого уровня (С/С++) — переносим, на Ассемблере кода нет.
В ядре и HAL есть небольшие включения на Ассемблере внутри слоя абстракции аппаратного обеспечения.
Последние 20лет ПК работают на х86 платформе, поэтому вопрос о переносимости перед разработчиками ОС не стоял.
Объектно-ориентированный подход
Ключевой принцип при проектировании Windows.
Любой ресурс системы представляется как некий объект. Ресурс – это любой ресурс который должен разделяться и к которому может быть доступ от нескольких процессов. Если ресурс используется в рамках одного процесса, то выделять его как объект не имеет смысла.
В основе Windows NT – объекты, унифицированная форма, имеющая:
- Именование
- Совместное использование
- Учет
Зачем все так сделано?
Есть несколько типов ресурсов, в бедующем можно добавлять другие ресурсы в систему, и чтобы эта унифицировать и не переписывать все ядро, создали унифицированную форму: наименование, совместное использование, учет.
Любой разделяемый ресурс системы – это объект.
Внутри структуры самого execute – не объекты.
Менеджер объектов
Это часть execute, сокращенное название OB(Object Manager) – эти же самые названия используются в языке СИ.
— Управляет ресурсами
- Физ. файлы и директории;
- Элементы реестра;
- Процессы (поток).
Каждый ресурс предоставляется объектом
Операции над объектами:
- Создание/удаление;
- Защита доступа;
- Подсчет ссылок (Reference counting).
Подсчет ссылок (Reference counting)
При создании или открытии объекта создается ссылка на объект, называемая хэндлом.
Хэндлы ассоциированы с процессом, но могут передаваться от одного процесса к другому, так как объектом можно пользоваться из разных процессов, то это разделяемый ресурс. Удобно передавать хэндлы.
По иерархии объектов существуют два класса объектов:
- executive – используются пользовательскими приложениями и компонентами самого executive (исполнительной подсистемы), их большинство, они общие.
- Kernel – представляют базовые ресурсы – физические устройства, примитивы синхронизации… Могут использоваться только в режиме ядра. Используются только ядром, т.е. с ними работает только ядро и больше никто.
Типы объектов Windows
Класс Executive
- Process – процесс (множество потоков, виртуальное адр.пространство и управляющая информация)
- Thread — поток
- Job – множество процессов
- File – открытый файл или устройство ввода/вывода
- File mapping object – область памяти отображаемая в файл
- Access token – права доступа
- Event — событие
- Semaphore/mutex – семафор/мьютекс (высокоуровневые примитивы синхронизации)
- Timer — таймер
- Key – ключ реестра
- Desktop – логический дисплей (раб.стол)
- Clipboard – временный репозиторий для других объектов
- Windows Station – множество объектов типа desktop/clipboard
- Symbolic link – символьная ссылка на другие объекты
- Можно создавать свой тип объекта.
Что такое сам объект физически?
Сам объект – это набор каких-то данных. Каких – менеджеру объектов без разницы. Объект состоит из двух больших частей: тело, заголовок.
Тело – сами данные(они интересуют конкретного потребителя).
Заголовок – добавляется менеджером объектов, в нем хранится внутренняя информация для организации объекта, его хранения, наименования, учета, работы, прав доступа.
- Имя
- Директория, которая ему принадлежит
- Дескриптор безопасности
- Сколько раз были открыты хэдлы объекта
- Список процессов, имеющих ссылку на данный объект
- Количество этих ссылок
- Тип
Все они нужны для работы менеджера объектов.
Объекты группируются в директории, чтобы их как то систематизировать. Строится все иерархическим образом, есть директории верхнего уровня(Root), потом есть ветви.
Файловая организация WindowsNT
- NTOSKRNL.EXE – ядро ОС (execute и kernel).
- HAL.DLL – абстракция аппаратного обеспечения. Так как в ОС изначально поддерживалась модульность, то слой абстракции аппаратного обеспечения располагается отдельным файлом.
- NTDLL.DLL – реализация Native API и системные вызовы – специальная библиотека, где хранятся системные вызовы, которые предоставляют пользователю удобный API интерфейс для работы.
Эти три файла фактически составляют ядро ОС, остальные файлы — подключаемые модули к ядру, драйвера, которые загружаются по необходимости. Смысл в том, что без этих трех файлов ничего работать не может, так как работать будет нечем.
Подключаемые файлы (подключаемые модули ядра) могут называться как угодно.
Модули ядра Windows NT нельзя вкомпилировать в само же ядро. В ОС Linex есть выбор, можно использовать их отдельно, можно вместе с ядром).
Для самой ОС три файла недостаточны, необходим еще ряд менеджеров и подсистем и всего прочего для того, чтобы организовать сложную архитектуру Windows NT, чтобы работало все подсистемное окружение.
Поэтому некоторые другие файлы тоже необходимы, они представлены ниже в порядке загрузки.
- SMSS.EXE – процесс менеджера сессий.
- WINLOGON.EXE – процесс управления аутентификацией пользователя (логон).
- SERVICES.EXE – процесс управления службами (сервисами).
- LSASS.EXE – процесс подсистемы Local Security Authority.
- CSRSS.EXE – процесс подсистемы Windows.
- WIN32R.SYS – часть подсистемы Win, работающая в режиме ядра. Драйвер, подключаемый модуль ядра, он реализует ту часть подсистемы окружения Win,которая работает в режиме ядра, т.е. это оконный менеджер и графическая подсистема.
- KERNEL32.DLL USER32.DLL GDI32.DLL – три ключевые динамические библиотеки подсистемы, реализуют пользовательскую часть подсистемы окружения Winвщцы. Для 64разрядной ОС применяются те же названия (с числом 32).
Подсистема Windows
Состоит из:
CSRSS.EXE – процесс подсистемы окружения Windows, который управляет консольными приложениями и реализует вспомогательные функции
Win32K.SYS – драйвер режима ядра, реализуется:
- Оконный менеджер;
- Обработка ввода с клавиатуры/мыши;
- Обмен сообщениями между окнами;
- Графическая подсистема (GDI).
Подсистема пользователя
- Динамические библиотеки подсистемы: ADVPI32.DLL, USER32.DLL, GDI32.DLL, KERNEL32.DLL
- Графические драйвера ( включая драйвер принтеров)
До Windows NT4.0 оконный менеджер и графическая подсистема были вынесены в режим пользователя. В силу слабых ПК от этого решения отказались.
Как все эти внутренности работают? Как это все увидеть с точки зрения программиста?
Инструменты
Инструменты – множество программ для исследования внутреннего устройства Windows и понимания принципа их работы.
Существуют утилиты, которые помогают разобраться в система Windows:
- Дополнения от MS
- Утилиты Sysinternals(MS) –автор Марк Россинович
- Сторонних разработчиков Opensource, аналоги Taskmanager
Посмотрим какие есть утилиты.
По адресу: http://technet.microsoft.com/en-us/sysinterhals/bb842062
можно скачать целый набор программ, который позволяет заглянуть во внутреннее устройство Windows, посмотреть что и как там сделано, что скрыто для пользовательской части. Эти программы в основном затрагивают мониторинг того, как работает ОС.
- Autorun – полный список автозапускаемых программ, можно искать программы с вредоносным кодом
- DebugView – просмотр дебаг-лога на локальной машине – журнал отладки
- DeskMon– мониторинг всех дисковых операций
- Handel– просмотр всех открытых процессом хендлов
- Junction – поддержка ссылок в файловой системе
- ListDll – список DLL, загруженных в процесс
- ProcessExplorer – очень детальная информация о каждом процессе
- ProcessMonitor – информация об операциях с ФС, реестром, процессами/потоками в реальном времени
- RAMMap – информация об использовании физической памяти
- WinObj– просмотр объектов ядра
Скачать презентацию к лекции «Операционная система Windows NT»
Cкачать тест по теме «Операционная система Windows NT»
Увлекательная и занимательная статья, буду следить за комментариями!
Автору спасибо
На мой взгляд, это интересный вопрос, буду принимать участие в обсуждении.
🙂
Ценные рекомендации, беру на заметку
Чем меньше люди знают, тем обширнее кажется им их знание.
Спасибо за инфу!
Классный пост
Подскажите пожалуйста, в какой папке находится ядро Windows?
И как называется файл ядра (главный), и где он находится физически?