ntoskrnl.exe
(сокращение от Windows NT Operating System kernel executable ), также известный как образ ядра , содержит ядро и исполнительные слои ядра Microsoft Windows NT и отвечает за абстракцию оборудования , обработку процессов и управление памятью . В дополнение к ядру и исполнительным слоям он содержит менеджер кэша , монитор ссылок безопасности, менеджер памяти, планировщик (Dispatcher) и синий экран смерти (проза и части кода). [1]
x86-версии ntoskrnl.exe
зависят от bootvid.dll
, hal.dll
и kdcom.dll
(x64-варианты ntoskrnl.exe
имеют эти DLL, встроенные в ядро для повышения производительности). Однако это не собственное приложение , поэтому оно не линковано с ntdll.dll
. Вместо этого ntoskrnl.exe
имеет собственную точку входа " KiSystemStartup ", которая вызывает архитектурно -независимую функцию инициализации ядра. Поскольку для этого требуется статическая копия объектов среды выполнения C, исполняемый файл обычно имеет размер около 10 МБ.
В Windows XP и более ранних версиях исходный код установки Windows поставляет четыре файла образа ядра для поддержки однопроцессорных систем , симметричных многопроцессорных (SMP) систем, ЦП с PAE и ЦП без PAE. Программа установки Windows решает, является ли система однопроцессорной или многопроцессорной, затем устанавливает как PAE, так и не-PAE варианты образа ядра для определенного типа. В многопроцессорной системе программа установки устанавливает ntkrnlmp.exe
и , ntkrpamp.exe
но переименовывает их в ntoskrnl.exe
и ntkrnlpa.exe
соответственно.
Начиная с Windows Vista, Microsoft начала унифицировать образы ядра, поскольку на рынке появились многоядерные процессоры , а PAE стал обязательным.
32-битная Windows | |||
Имя файла | Поддерживает СМП | Поддерживает PAE | |
---|---|---|---|
32-битное ядро | |||
ntoskrnl.exe | Нет | Нет | |
ntkrnlmp.exe | Да | Нет | |
ntkrnlpa.exe | Нет | Да | |
ntkrpamp.exe | Да | Да | |
64-битное ядро ( редакции x64 ) | |||
Имя файла | Поддерживает СМП | Поддерживает 57-битную VA | |
ntkrnlmp.exe | Да | Нет | |
ntkrla57.exe | Да | Да |
Архитектура ядра Windows структурирована таким образом, чтобы все было легко понять [ необходимо разъяснение ] . Функции и глобальные переменные используют так называемое форматирование Pascal Case со специальными (дополнительными) префиксами в своих именах для различения частей ядра.
Примером являются IoCreateDevice и ObReferenceObjectByHandle . Обе функции имеют разные имена префиксов для различения критических менеджеров в коде ядра: Io используется для функций менеджера ввода-вывода, а Ob — для функций менеджера объектов .
Существуют вариации этих префиксов для внутренних функций, которые не экспортируются ядром, например, добавление i после первой буквы (например, Ki
для «Kernel Internal») или добавление p к полному префиксу (например, Psp
для «Process Support Internal»).
В следующей таблице перечислены все префиксы.
Экспортировать префикс | Внутренний префикс | Значение |
---|---|---|
Cc | Ккп | Кэш файловой системы [2] |
Cm | Кмп | Диспетчер конфигурации, часть режима ядра реестра Windows |
Dbg | Дбг | Функции отладки, такие как программная точка останова |
Dbgk | Дбгк | Набор функций отладки, которые доступны в пользовательском режиме через ntdll.dll |
Ex | Эксп | Исполнительный компонент Windows, «внешний слой»ntoskrnl.exe |
FsRtl | FsRtlp | Библиотека времени выполнения файловой системы [3] |
Io | Иоп | Менеджер ввода-вывода [4] |
Ke | Ки | Основные процедуры ядра [5] |
Кх | Обработка прерываний , семафоры, спин-блокировки , многопоточность и функции, связанные с переключением контекста | |
Кс | Потоковая передача ядра | |
Ldr | Лдрп | Загрузчик исполняемых файлов PE для NT |
Lpc | Лпцп | Локальный вызов процедур — внутренний, недокументированный, межпроцессный или механизм передачи сообщений между пользователем и ядром. |
Lsa | Лсап | Местный орган безопасности |
Mm | Ми | Управление памятью |
Nls | Нлс | Nls для поддержки родного языка (аналогично кодовым страницам). |
Ob | Обп | Менеджер объектов |
Po | Поп | Plug-and-play и управление питанием [6] |
Ps | ПСП | Управление процессами и потоками (управление задачами) |
Rtl | Ртлп | Библиотека времени выполнения , т. е. множество служебных функций, которые могут использоваться собственными приложениями, но не требуют прямой поддержки ядра. |
Se | сен | Security Manager, токен доступа для Win32 API |
Vf | Ви | Драйвер-верификатор |
Zw/Nt | Nt или Zw системные вызовы, объявленные в ntdll.dll и ntoskrnl.exe . При вызове из ntdll.dll в пользовательском режиме эти группы почти одинаковы; они переходят в режим ядра и вызывают эквивалентную функцию в ntoskrnl.exe через SSDT . При вызове функций напрямую в ntoskrnl.exe (возможно только в режиме ядра) Zw варианты обеспечивают режим ядра, тогда как Nt варианты — нет. [7] |
Когда ядро получает управление, оно получает указатель типа struct от bootloader . Место назначения указателя содержит информацию об оборудовании, путь к файлу реестра Windows, параметры ядра, содержащие настройки загрузки или опции, которые изменяют поведение ядра, путь к файлам, загруженным загрузчиком ( SYSTEM
куст реестра , nls
для преобразования кодировки символов и vga
шрифта). [8] Определение этой структуры можно получить с помощью отладчика ядра или загрузив его из базы данных символов Microsoft. [9] [ нужна страница ]
В архитектуре x86 ядро получает систему уже в защищенном режиме с готовыми GDT , IDT и TSS . [ необходимо дополнительное объяснение ] Но поскольку оно не знает адреса каждого из них, ему приходится загружать их по одному, чтобы заполнить структуру PCR . [ жаргон ]
Основная точка входа ntoskrnl.exe
выполняет некоторую зависящую от системы инициализацию, затем вызывает независимую от системы инициализацию, а затем входит в цикл ожидания. [ противоречиво ]
Современные операционные системы используют прерывания вместо опроса портов ввода-вывода для ожидания информации от устройств.
В архитектуре x86 прерывания обрабатываются через таблицу обработки прерываний (IDT). Когда устройство запускает прерывание и в регистре FLAGS устанавливается флаг прерывания (IF) , аппаратное обеспечение процессора ищет обработчик прерываний в записи таблицы, соответствующей номеру прерывания, который, в свою очередь, был переведен из IRQ чипами PIC или, в более современном оборудовании, APIC . Обработчики прерываний обычно сохраняют некоторое подмножество состояния регистров перед его обработкой и восстанавливают их до исходных значений по завершении.
Таблица прерываний содержит обработчики для аппаратных прерываний, программных прерываний и исключений. Для некоторых версий ядра IA-32 одним из примеров такого программного обработчика прерываний (которых много) является запись в его таблице IDT 2E 16 ( шестнадцатеричное ; 46 в десятичном ), используемая в языке ассемблера как INT 2EH
для системных вызовов . В реальной реализации запись указывает на внутреннюю подпрограмму с именем (согласно символьной информации, опубликованной Microsoft) . Для более новых версий вместо этого используются KiSystemService
различные механизмы, использующие SYSENTER
инструкцию и в инструкции x86-64 . SYSCALL
Одной из примечательных особенностей обработки прерываний NT является то, что прерывания обычно условно маскируются на основе их приоритета (называемого "IRQL"), вместо того, чтобы отключать все IRQ через флаг прерывания. Это позволяет различным компонентам ядра выполнять критические операции без обязательной блокировки служб периферийных устройств и других устройств. [10]
Весь диапазон адресов физической памяти (ОЗУ) разбит на множество небольших блоков, также называемых страницами, размером 4 КБ каждый, и сопоставленных с виртуальными адресами. Некоторые свойства каждого блока хранятся в структурах, называемых записями таблицы страниц , которые управляются ОС и к которым обращается аппаратное обеспечение процессора. Таблицы страниц организованы в древовидную структуру, а физический номер страницы таблицы верхнего уровня хранится в регистре управления 3 (CR3).
Microsoft Windows делит виртуальное адресное пространство на две области. Нижняя часть, начинающаяся с нуля, создается отдельно для каждого процесса и доступна как из пользовательского режима, так и из режима ядра. Прикладные программы запускаются в процессах и предоставляют код, который выполняется в пользовательском режиме. Верхняя часть доступна только из режима ядра и, за некоторыми исключениями, создается только один раз, во всей системе. ntoskrnl.exe
отображается в эту область, как и несколько других компонентов режима ядра. Эта область также содержит данные, используемые кодом режима ядра, такие как кучи режима ядра и кэш файловой системы.
Арка | MmHighestUserAddress | MmSystemRangeStart |
---|---|---|
x86 [а] | 0x7fffffff | 0x80000000 |
РУКА | ||
x86-64 | 0x000007ff'ffffffff (до Windows 8.1 Update 2) 0x00007fff'ffffffff (начиная с Windows 8.1 Update 3) | 0xffff8000'00000000 |
Реестр Windows — это хранилище информации о конфигурации и настройках для операционной системы и другого программного обеспечения, например приложений. Его можно рассматривать как файловую систему, оптимизированную для небольших файлов. [11] Однако доступ к нему осуществляется не через семантику файловой системы, а через специализированный набор API, реализованный в режиме ядра и доступный для пользовательского режима.
Реестр хранится на диске в виде нескольких различных файлов, называемых «ульями». Один из них, системный куст, загружается на ранней стадии загрузки и предоставляет информацию о конфигурации, необходимую в это время. Дополнительные кусты реестра, предоставляющие данные, специфичные для программного обеспечения и пользователя, загружаются на более поздних этапах инициализации системы и во время входа пользователя в систему соответственно.
Список драйверов, которые необходимо загрузить с диска, извлекается из Services
ключа текущего набора управления в SYSTEM
кусте реестра. Этот ключ хранит драйверы устройств, процессы ядра и пользовательские процессы. Все они вместе называются «службами» и все хранятся в смешанном виде в одном месте.
Во время инициализации или при запросе загрузки драйвера ядро просматривает это дерево в поисках служб, помеченных как службы ядра.
/userva
или /3gb
.increaseuserva
Как упоминалось в книге «Внутреннее устройство Windows», 7-е издание, для этой функции требуются параметр загрузки и соответствующий заголовок в исполняемом образе.