Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

2.3.1.1. Уровень абстрагирования оборудования (HAL)

Для написания большей части исходного кода ядра NTOS использовался язык программирования высокого уровня С, а не язык ассемблера (на языке ассемблера написано всего лишь около двух процентов кода для процессоров с 32-разрядной архитектурой и меньше одного процента для процессоров с 64-разрядной архитектурой). Но даже с условием использования языка высокого уровня при написании исходного кода ядра системы нельзя взять данный код, например, из системы х86, перенести его в систему ARM, перекомпилировать и перезагрузиться. Это невозможно по причине того, что архитектуры процессоров имеют множество аппаратных различий. Языки высокого уровня затрудняют абстрагирование как некоторых структур данных, так и некоторых параметров оборудования. На более высокие уровни системы могут повлиять также аппаратные подробности организации памяти (а также наличие некоторых аппаратных примитивов синхронизации). В системе также имеется много зависимостей от принятого порядка байтов в словах.

Кроме описанных выше проблем переносимости есть также и более мелкие проблемы. На реализацию примитивов синхронизации может повлиять разница в процессорах. Например, разные семейства чипсетов могут иметь разные способы доступа к регистрам устройств ввода-вывода, разные приоритеты аппаратных прерываний, различия в управлении передачей в режиме DMA, различные способы синхронизации многопроцессорности, разные подходы к управлению таймерами и часами реального времени, разные способы работы с прошивкой и т.д. Компания Microsoft скрыла особенности компьютерных систем внутри тонкого уровня, располагающегося над оборудованием и называемого уровнем абстрагирования оборудования (HAL). Главной задачей HAL является предоставление для остальной части операционной системы некого абстрактного оборудования, скрывающего специфические подробности. Такие абстракции уровня HAL получили форму независимых от компьютера служб, которые могут одинаково использоваться и драйверами, и исполнительным уровнем NTOS.

Перенос на новые процессоры с использованием служб HAL, а также при условии отсутствия прямых обращений к оборудованию от драйверов и ядра системы, требует меньше изменений. Кроме того, изменений совсем не требуется, если системы обладают одинаковой архитектурой процессора, даже при условии разности версий и чипсетов.

Перенос самого HAL достаточно прост, так как весь машинно-зависимый код находится в одном месте, а цель переноса четко определена: необходима реализация всех служб уровня HAL. Компания Microsoft позволяет производителям систем создавать собственный HAL, предоставляя для этого набор инструментов HAL Development Kit, использование которого позволяет работать на новых системах прочим компонентам ядра без модификаций с единственным условием — не слишком значительными изменениями в оборудовании.

Рис

Рис. 2.4. Некоторые функции оборудования, управляемые HAL

Конкретные устройства ввода-вывода требуют частого обращения от драйверов. Конкретное устройство на уровне оборудования имеет один или несколько адресов на шине. У современных компьютеров часто бывает в наличии несколько шин (таких как PCIe, IEEE 1394, USB, PCI и т. д.), поэтому возможна такая ситуация, при которой разные устройства на разных шинах имеют один и тот же адрес, и необходим способ отличать их друг от друга. Служба для идентификации устройств на уровне HAL устанавливает соответствие логических и реальных адресов устройств на шине. Таким образом, драйверы уже могут не отслеживать, к какой конкретно шине подключено то или иное устройство. HAL также предоставляет службы для именования зависящих от шины прерываний и определяет способы, позволяющие драйверам закрепить определенные процедуры обработки за конкретными прерываниями. HAL также занимается управлением уровня запроса прерываний.

Настройка передачи данных в режиме DMA и независимое от устройств управление этой передачей является еще одной службой HAL. Так как ссылки на устройства осуществляются по их логическим адресам, данная служба HAL может работать как с системным DMA, так и с DMA для карт ввода-вывода. HAL также управляет часами и таймерами. Иногда компоненты ядра требуют синхронизации на низком уровне, например, для исключения возможности появления состояния гонки в многопроцессорных системах. Для управления такой синхронизацией HAL предоставляет примитивы.

После того, как система загружена, HAL узнает прошивку компьютера, изучает параметры системы для определения наличия и конфигурации определенных шин и устройств ввода-вывода. Затем полученные данные сохраняются в системном реестре. Основные функции уровня абстрагирования оборудования изображены на рис. 2.4.

Предыдущий раздел Оглавление Следующий раздел