Как уже упоминалось, одним из наиболее важных элементов конструкции Windows является ее переносимость между разнообразными аппаратными платформами. Уровень аппаратных абстракций — hardware abstraction layer (HAL) является ключевой частью, обеспечивающей возможность такой переносимости.
HAL является загружаемым модулем режима ядра (Hal.dll), обеспечивающим низкоуровневый интерфейс с аппаратной платформой, на которой запущена Windows. Он скрывает подробности, зависящие от аппаратуры, такие как интерфейсы ввода-вывода, контроллеры прерываний и механизмы взаимодействия процессоров, — любые функции, имеющие как архитектурные, так и машинные зависимости.
Поэтому вместо непосредственного доступа к оборудованию, внутренние компоненты Windows, а также написанные пользователями драйверы устройств, при необходимости получения информации, зависящей от платформы, поддерживают переносимость путем вызова HAL-подпрограмм. По этой причине HAL-подпрограммы документированы в WDK. Для получения дополнительной информации о HAL и его использовании драйверами устройств нужно обратиться к WDK.
Хотя в операционную систему включено несколько HAL-модулей (см. табл), у Windows есть возможность определить во время загрузки, какой HAL-модуль должен использоваться, исключая проблемы, существовавшие в ранее выпущенных версиях Windows при попытке загрузки установки Windows на разных типах систем.
Содержание:
Перечень HAL-модулей для x86.
Имя HAL-файла | Поддерживаемые системы |
---|---|
Halacpi.dll | Персональные компьютеры с усовершенствованным интерфейсом управления конфигурированием и энергопотреблением — Advanced Configuration and Power Interface (ACPI). Предназначается только для однопроцессорной машины без поддержки усовершенствованного программируемого контроллера прерываний — APIC (наличие любого из таких контроллеров заставит систему использовать вместо этого HAL-модуль, показанный ниже) |
Halmacpi.dll | Персональные компьютеры с усовершенствованным программируемым контроллером прерываний — Advanced Programmable Interrupt Controller (APIC), имеющие ACPI. Наличие APIC подразумевает поддержку симметричной мультипроцессорной обработки — SMP |
ПРИМЕЧАНИЕ. На x64-машинах имеется только один HAL-образ по имени Hal.dll. Это обусловлено наличием у всех x64-машин материнских плат одинаковой конфигурации, поскольку процессы требуют поддержки ACPI и APIC. Следовательно, поддержка машин без ACPI или со стандартного программируемого контроллера прерываний — PIC, не требуется.
Эксперимент: определение запущенного HAL-модуля.
Определить, какая версия HAL-модуля запущена, можно с помощью WinDbg и открытия сеанса локальной отладки ядра. Обеспечьте путем ввода команды .reload загрузку символов, а затем наберите команду lm vm hal.
Например, следующий вывод получен на системе, запустившей ACPI HAL:
lkd> lm vm hal
start end module name
fffff800'0181b000 fffff800'01864000 hal (deferred)
Loaded symbol image file: halmacpi.dll
Image path: halmacpi.dll
Image name: halmacpi.dll
Timestamp: Mon Jul 13 21:27:36 2009 (4A5BDF08)
CheckSum: 0004BD36
ImageSize: 00049000
File version: 6.1.7600.16385
Product version: 6.1.7600.16385
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft® Windows® Operating System
InternalName: halmacpi.dll
OriginalFilename: halmacpi.dll
ProductVersion: 6.1.7600.16385
FileVersion: 6.1.7600.16385 (win7_rtm.090713-1255)
FileDescription: Hardware Abstraction Layer DLL
LegalCopyright: © Microsoft Corporation. All rights reserved.
Эксперимент: просмотр зависимостей NTOSKRNL и HAL.
Взаимоотношения между ядром и HAL-образами можно просмотреть путем изучения их таблиц экспорта и импорта с помощью средства DependencyWalker (Depends.exe). Для изучения образа в DependencyWalker выберите пункт Open (Открыть) в меню File (Файл), чтобы открыть требуемый файл образа.
Пример вывода, который можно увидеть путем просмотра зависимостей Ntoskrnl с использованием этого средства может иметь следующий вид.
Обратите внимание на то, что Ntoskrnl связан с HAL, который, в свою очередь, связан с Ntoskrnl. (Они оба используют функции друг друга.) Ntoskrnl также связан со следующими исполняемыми файлами:
- Pshed.dll, драйвер ошибок оборудования — Platform-Specific Hardware Error Driver (PSHED), зависящий от используемой платформы. Этот драйвер предоставляет абстракцию средства выдачи отчетов об ошибках оборудования исходной платформы, скрывая подробности присущих платформе механизмов обработки ошибок от операционной системы и открывая операционной системе Windows однообразный интерфейс.
- Bootvid.dll (только на 32-разрядных операционных системах), видеодрайвер загрузки. Bootvid предоставляет поддержку команд VGA, требуемых для отображения при запуске загрузочного текста и загрузочного логотипа. На системах x64 эта библиотека во избежание конфликтов со средством защиты ядра от исправлений — Kernel Patch Protection (KPP) встроена в ядро.
- Kdcom.dll, библиотека протокола коммуникаций отладчика ядра — KernelDebuggerProtocol (KD) CommunicationsLibrary.
- Ci.dll, библиотека целостности кода.
- Clfs.sys, драйвер общей системы файлов журнала, используемых, кроме всего прочего, диспетчером транзакций ядра — Transaction Manager (KTM).
Подробное описание информации, показываемой этим средством, дана в справочном файле по DependencyWalker (Depends.hlp).