ntoskrnl.exe (сокращение от исполняемого файла ядра операционной системы Windows NT ), также известный как образ ядра , содержит ядро и исполнительные уровни ядра Microsoft Windows NT и отвечает за абстракцию оборудования , обработку процессов и управление памятью . Помимо упомянутого ранее ядра и исполнительной системы, он содержит диспетчер кэша , монитор безопасности, диспетчер памяти, планировщик (диспетчер) и синий экран смерти (текст и части кода). [1]
Версии ntoskrnl.exe для x86 зависят от bootvid.dll
, hal.dll
и kdcom.dll
(варианты ntoskrnl.exe для x64 включают эти библиотеки DLL в ядро для повышения производительности). Однако это не нативное приложение . Другими словами, он не связан с ntdll.dll
. Вместо этого ntoskrnl.exe содержит стандартную точку входаstart
" " , которая вызывает независимую от архитектуры функцию инициализации ядра. Поскольку для этого требуется статическая копия объектов среды выполнения C, размер исполняемого файла обычно составляет около 10 МБ.
В Windows XP и более ранних версиях исходный код установки Windows включает четыре файла образа ядра для поддержки однопроцессорных систем , симметричных многопроцессорных систем (SMP), ЦП с PAE и ЦП без PAE. Программа установки Windows решает, является ли система однопроцессорной или многопроцессорной, а затем устанавливает варианты образа ядра как с PAE, так и без PAE для выбранного типа. В многопроцессорной системе программа установки устанавливает ntkrnlmp.exe
и ntkrpamp.exe
переименовывает их в ntoskrnl.exe
и ntkrnlpa.exe
соответственно.
Начиная с Windows Vista, Microsoft начала унифицировать образы ядра, когда на рынке появились многоядерные процессоры, и PAE стал обязательным.
Подпрограммы в ntoskrnl используют префиксы в своих именах, указывающие, в каком компоненте ntoskrnl они определены.
Поскольку не все функции экспортируются ядром, префиксы функций, оканчивающиеся на i или p (например, Mi, Obp, Iop), являются внутренними и не должны быть доступны пользователю. Эти функции содержат основной код и реализуют важные проверки, например на наличие уязвимостей, недостающих аргументов и обработку исключений.
В следующей таблице перечислены некоторые из них.
Когда ядро получает управление, оно получает указатель типа структуры от загрузчика . Назначение указателя содержит информацию об оборудовании, пути к файлу реестра Windows, параметрах ядра, содержащих настройки загрузки или параметры, изменяющие поведение ядра, путь к файлам, загружаемым загрузчиком (куст реестра, SYSTEM
для преобразования nls
кодировки символов, и vga
шрифт). [8] Определение этой структуры можно получить с помощью отладчика ядра или загрузив его из базы данных символов Microsoft. [9] [ нужна страница ]
В архитектуре x86 ядро получает систему уже в защищенном режиме, с готовыми GDT , IDT и TSS . [ необходимо дальнейшее объяснение ] Но поскольку он не знает адреса каждого из них, ему приходится загружать их один за другим, чтобы заполнить структуру PCR . [ жаргон ]
Основная точка входа ntoskrnl.exe выполняет некоторую системно-зависимую инициализацию, затем вызывает независимую от системы инициализацию и затем входит в цикл ожидания. [ противоречивый ]
Современные операционные системы используют прерывания вместо опроса портов ввода-вывода для ожидания информации от устройств.
В архитектуре x86 прерывания обрабатываются с помощью таблицы диспетчеризации прерываний (IDT). Когда устройство запускает прерывание и флаг прерывания (IF) в регистре FLAGS установлен, аппаратное обеспечение процессора ищет обработчик прерывания в записи таблицы, соответствующей номеру прерывания, который, в свою очередь, был преобразован из 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, как и несколько других компонентов режима ядра. Эта область также содержит данные, используемые кодом режима ядра, такие как кучи режима ядра и кэш файловой системы.
Реестр Windows — это хранилище информации о конфигурации и настройках операционной системы и другого программного обеспечения, например приложений. Его можно рассматривать как файловую систему, оптимизированную для небольших файлов. [11] Однако доступ к нему осуществляется не через семантику, подобную файловой системе, а через специализированный набор API, реализованный в режиме ядра и доступный для пользовательского режима.
Реестр хранится на диске в виде нескольких файлов, называемых «ульями». Один из них, системный куст, загружается в начале последовательности загрузки и предоставляет информацию о конфигурации, необходимую в этот момент. Дополнительные кусты реестра, предоставляющие данные, специфичные для программного обеспечения и пользователя, загружаются на более поздних этапах инициализации системы и во время входа пользователя в систему соответственно.
Список драйверов, которые будут загружены с диска, извлекается из ключа Services
текущего набора элементов управления в SYSTEM
кусте реестра. В этом ключе хранятся драйверы устройств, процессы ядра и пользовательские процессы. Все они вместе называются «сервисами» и хранятся в одном и том же месте.
Во время инициализации или по запросу загрузки драйвера ядро просматривает это дерево в поисках служб, помеченных как службы ядра.
/userva
или /3gb
переключателя.