- Hardware abstraction layer
- Hardware abstraction layer
- Национальная библиотека им. Н. Э. Баумана Bauman National Library
- Персональные инструменты
- HAL (Hardware Abstraction Layer)
- Содержание
- Текущее состояние
- Причины устранения
- Процесс миграции c HAL на udev
- Уровень аппаратных абстракций
- Перечень HAL-модулей для x86.
- Эксперимент: определение запущенного HAL-модуля.
- Эксперимент: просмотр зависимостей NTOSKRNL и HAL.
Hardware abstraction layer
Hardware abstraction layer
Hardware Abstraction Layer (HAL, Слой аппаратных абстракций) — слой абстрагирования, реализованный в программном обеспечении, находящийся между физическим уровнем аппаратного обеспечения и программным обеспечением, запускаемом на этом компьютере. HAL предназначен для скрытия различий в аппаратном обеспечении от основной части ядра операционной системы, таким образом чтобы большая часть кода, работающая в режиме ядра не нуждалась в изменении при её запуске на системах с различным аппаратным обеспечением. На персональных компьютерах HAL, по существу, может рассматриваться как драйвер материнской платы, позволяющий взаимодействовать инструкциям высокоуровневых языков программирования с низкоуровневыми компонентами, такими как аппаратное обеспечение.
В операционных системах семейства Windows NT HAL является неотъемлемой частью кода, исполняемого в режиме ядра, находится в отдельном загрузочном модуле, загружаемым совместно с ядром. [1] Это обеспечивает возможность использования одного и того же загрузочного модуля собственно ядра ОС Windows NT на ряде систем с различными архитектурами шин ввода/вывода, управления прерываниями и таймерами. К примеру, рабочие станции, основанные на SGI Intel x86, были не совместимы с IBM PC-совместимыми рабочими станциями, но благодаря HAL Windows NT мог запускаться на них. Аналогичным образом одно и то же ядро Windows NT используется и на современных системах с контроллером прерываний APIC, так и на устаревших системах без поддержки APIC.
BSD, Mac OS X, Linux, CP/M, MS-DOS, Solaris и некоторые другие портируемые ОС также имеют HAL, несмотря на то, что он не разрабатывался явно для выполнения описанных выше функций. Некоторые системы, такие как Linux, имеют возможность вставлять подобный слой, к примеру Adeos, во время работы. Ядро операционной системы NetBSD широко известно наличием чистого слоя абстрагирования от аппаратного обеспечения (HAL), что позволяет ему быть высоко-портируемым. Частью этой системы являются uvm(9) [2] /pmap(9) [3] , bus_space(9) [4] , bus_dma(9) [5] и другие подсистемы. Популярные шины, которые используются более чем на одной архитектуре, такие как ISA, EISA, PCI, PCI-E и др., также абстрагированы, позволяя написанным под них драйверам также быть высоко-портируемыми с минимальным изменением кода.
«Экстремальный» пример HAL может быть найден в архитектурах System/38 и AS/400. Большинство компиляторов для таких систем генерируют абстрактный машинный код. Лицензированный внутренний код (Licensed Internal Code, LIC) переводит этот виртуальный машинный код во внутренний(собственный) код процессора, на котором он запускается, и выполняет получившийся внутренний код. (Исключение составляют компиляторы, которые сами генерируют ЛИК; эти компиляторы не доступны за пределами IBM). К примеру, прикладное программное обеспечение и программное обеспечение операционной системы, расположенные над слоем ЛИК, скомпилированные на оригинальной архитектуре System/38, запускаются без каких-либо модификаций и перекомпиляций на последних системах AS/400. И это несмотря на тот факт, что лежащее в основе аппаратное обеспечение было кардинально изменено; по крайней мере три различных типа микропроцессоров находились в использовании.
HAL является даже более низким уровнем в компьютерных языках программирования, чем API, потому что он взаимодействует непосредственно с аппаратным обеспечением вместо ядра системы, следовательно HAL требует меньше процессорного времени чем API. Языки высокого уровня часто используют HAL и API для взаимодействия с компонентами более низкого уровня.
Операционные системы, имеющие HAL, легко портируются на различное оборудование. Это особенно важно для встраиваемых систем, которые должны работать на большом количестве различных платформ.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
HAL (Hardware Abstraction Layer)
Предыдущий выпуск: | 0.5.14 / 30 ноября 2009 |
---|---|
Состояние разработки: | Разработка прекращена |
Операционная система: | Linux, FreeBSD, NetBSD, OpenSolaris, Solaris |
Платформа: | UNIX |
Лицензия: | GNU General Public License и Academic Free License |
Веб-сайт | freedesktop .org |
Hardware Abstraction Layer (HAL, Слой аппаратных абстракций) — слой абстрагирования, реализованный в программном обеспечении, находящийся между физическим уровнем аппаратного обеспечения и программным обеспечением, запускаемом на этом компьютере. HAL предназначен для скрытия различий в аппаратном обеспечении от основной части ядра операционной системы, таким образом, чтобы большая часть кода, работающая в режиме ядра, не нуждалась в изменении при её запуске на системах с различным аппаратным обеспечением. На персональных компьютерах HAL, по существу, может рассматриваться как драйвер материнской платы, позволяющий взаимодействовать инструкциям высокоуровневых языков программирования с низкоуровневыми компонентами, такими, как аппаратное обеспечение [Источник 1] .
В операционных системах семейства Windows NT HAL является неотъемлемой частью кода, исполняемого в режиме ядра, находится в отдельном загрузочном модуле, загружаемом совместно с ядром. Это обеспечивает возможность использования одного и того же загрузочного модуля собственно ядра ОС Windows NT на ряде систем с различными архитектурами шин ввода-вывода, управления прерываниями и таймерами. К примеру, рабочие станции, основанные на SGI Intel x86, были не совместимы с IBM PC-совместимыми рабочими станциями, но благодаря HAL Windows NT мог запускаться на них. Аналогичным образом одно и то же ядро Windows NT используется как на современных системах с контроллером прерываний APIC, так и на устаревших системах без поддержки APIC.
Windows Vista и выше (Windows Server 2008 и выше для серверов) автоматически определяют, какой уровень HAL должен быть использован во время загрузки.
BSD, Mac OS X, Linux, Solaris, CP/M, MS-DOS и некоторые другие портируемые ОС также имеют HAL, несмотря на то, что он не разрабатывался явно для выполнения описанных выше функций. Некоторые системы, такие, как Linux, имеют возможность вставлять подобный слой, к примеру, Adeos (англ.)русск., во время работы. Ядро операционной системы NetBSD широко известно наличием чистого слоя абстрагирования от аппаратного обеспечения (HAL), что позволяет ему быть высоко-портируемым. Частью этой системы являются uvm(9)/pmap(9), bus_space(9), bus_dma(9) и другие подсистемы. Популярные шины, которые используются более чем на одной архитектуре, такие, как ISA, EISA, PCI, PCI-E и др., также абстрагированы, позволяя написанным под них драйверам также быть высокопортируемыми с минимальным изменением кода.
«Экстремальный» пример HAL может быть найден в архитектурах System/38 (англ.)русск. и AS/400. Большинство компиляторов для таких систем генерируют абстрактный машинный код. Лицензированный внутренний код (LIC) переводит этот виртуальный машинный код во внутренний (собственный) код процессора, на котором он запускается, и выполняет получившийся внутренний код (исключение составляют компиляторы, которые сами генерируют LIC; эти компиляторы не доступны за пределами IBM). К примеру, прикладное программное обеспечение и программное обеспечение операционной системы, расположенные над слоем LIC, скомпилированные на оригинальной архитектуре System/38, запускаются без каких-либо модификаций и перекомпиляций на последних системах AS/400. И это несмотря на тот факт, что лежащее в основе аппаратное обеспечение было кардинально изменено; по крайней мере, три различных типа микропроцессоров находились в использовании.
HAL является даже более низким уровнем в компьютерных языках программирования, чем API, потому что он взаимодействует непосредственно с аппаратным обеспечением вместо ядра системы, следовательно, HAL требует меньше процессорного времени, чем API. Языки высокого уровня часто используют HAL и API для взаимодействия с компонентами более низкого уровня.
Операционные системы, имеющие HAL, легко портируются на различное оборудование. Это особенно важно для встраиваемых систем, которые должны работать на большом количестве различных платформ [Источник 2] .
Содержание
Текущее состояние
HAL является устаревшим и не рекомендуется к использованию. Решения, поставленные за основу при проектировании HAL, на практике оказались неэффективными и единственным выходом оказалось создание новой подсистемы и перенос функциональности. Такой системой стал udev. В настоящий момент поддержка HAL убрана из ядра, а самые крупные дистрибутивы (Ubuntu[3], Debian и Fedora) завершили переход и используют Udev.
Причины устранения
Основное преимущество в новой подсистеме udev (перед HAL) в том, что первый является событийно-управляемой и имеет тесную интеграцию с ядром, а HAL же, будучи реализованным в userspace в виде демона, вынужден периодически опрашивать ядро. Таким образом, использование событийно-управляемого udev значительно снижает нагрузку на систему, а значит и электропотребление. Также, описания правил для устройств выполнены в виде простых файлов конфигурации и гораздо проще и понятней для пользователей и разработчиков, чем XML примененный ранее в HAL. И наконец, udev разработан «с чистого листа», с учётом предыдущего опыта и в нём отсутствует устаревший или беспорядочный код.
Процесс миграции c HAL на udev
Изначально большая часть логики HAL была перенесена в udev, а правила в новый модуль — DeviceKit (не путать с PolicyKit или ConsoleKit). Однако вскоре схема udev+DeviceKit несколько изменилась — разработчики обнаружили, что большая часть аппаратуры уже управляется различными программными компонентами и необходимы только правила для дисков (udisks) и питания (upower). Проект DeviceKit был разбит на несколько более мелких частей и больше не используется и не упоминается. Таким образом современные дистрибутивы используют только Udev и правила к нему (udisks, upower — часть пакета udev-extras). Однако ввиду инерционности кода, многие программы всё ещё требуют устаревший HAL (в основном для обнаружения дисков) и поэтому дистрибутивы вынуждены поставлять HAL, фактически дублируя логику (например Qt3, и столкнувшийся с этим проект Trinity).
Уровень аппаратных абстракций
Как уже упоминалось, одним из наиболее важных элементов конструкции 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:
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)
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
CompanyName: Microsoft Corporation
ProductName: Microsoft® Windows® Operating System
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 также связан со следующими исполняемыми файлами: