Аппаратные абстракции — это наборы процедур в программном обеспечении , которые предоставляют программам доступ к аппаратным ресурсам через программные интерфейсы. Программный интерфейс позволяет всем устройствам в определенном классе C аппаратных устройств получать доступ через идентичные интерфейсы, даже если C может содержать различные подклассы устройств, каждый из которых предоставляет другой аппаратный интерфейс.
Аппаратные абстракции часто позволяют программистам писать независимые от устройств , высокопроизводительные приложения, предоставляя стандартные вызовы операционной системы (ОС) к оборудованию. Процесс абстрагирования частей оборудования часто выполняется с точки зрения ЦП . Каждый тип ЦП имеет определенную архитектуру набора инструкций или ISA. ISA представляет примитивные операции машины, которые доступны для использования программистами ассемблера и писателями компиляторов. Одна из основных функций компилятора — позволить программисту написать алгоритм на языке высокого уровня, не заботясь о специфических инструкциях ЦП. Затем компилятор должен сгенерировать исполняемый файл, специфичный для ЦП. Тот же тип абстракции реализован в операционных системах, но теперь примитивные операции машины представляют API ОС, а не ISA. Это позволяет программисту использовать операции уровня ОС (например, создание/удаление задачи) в своих программах, сохраняя при этом переносимость на различные платформы.
Во многих ранних компьютерных системах не было никакой формы аппаратной абстракции. Это означало, что любой, кто писал программу для такой системы, должен был знать, как каждое аппаратное устройство взаимодействует с остальной частью системы. Это было серьезной проблемой для разработчиков программного обеспечения, поскольку им затем приходилось знать, как работает каждое аппаратное устройство в системе, чтобы обеспечить совместимость программного обеспечения . С аппаратной абстракцией, вместо того, чтобы программа взаимодействовала напрямую с аппаратным устройством, она сообщает операционной системе, что устройство должно делать, которая затем генерирует аппаратно-зависимую инструкцию для устройства. Это означало, что программистам не нужно было знать, как работают конкретные устройства, что делало их программы совместимыми с любым устройством.
Примером этого может быть абстракция «джойстика». Устройство джойстика , для которого существует множество физических реализаций, доступно для чтения/записи через API, который могут совместно использовать многие устройства, подобные джойстикам. Большинство устройств-джойстиков могут сообщать направления движения. Многие устройства-джойстики могут иметь настройки чувствительности, которые могут быть настроены внешним приложением. Абстракция джойстика скрывает детали (например, формат регистра, адрес I2C ) оборудования, так что программисту, использующему абстрагированный API, не нужно понимать детали физического интерфейса устройства. Это также позволяет повторно использовать код , поскольку один и тот же код может обрабатывать стандартизированные сообщения из любой реализации, которая предоставляет абстракцию «джойстика». «Подталкивание вперед» может быть от потенциометра или от емкостного сенсорного датчика, который распознает жесты «смахивания», при условии, что оба они предоставляют сигнал, связанный с «движением».
Поскольку физические ограничения (например, разрешение сенсора, временная частота обновления) могут меняться в зависимости от оборудования, API мало что может сделать, чтобы скрыть это, кроме как предполагая модель «наименьший общий знаменатель». Таким образом, некоторые глубокие архитектурные решения из реализации могут стать релевантными для пользователей конкретного экземпляра абстракции.
Хорошей метафорой является абстракция транспорта. И езда на велосипеде, и вождение автомобиля являются транспортом. У них обоих есть общие черты (например, вы должны управлять) и физические различия (например, использование ног). Всегда можно указать абстракцию «ехать» и позволить разработчику решить, что лучше — ехать на велосипеде или ехать на автомобиле. Функция «колесный наземный транспорт» абстрагируется, а детали «как ехать» инкапсулируются.
Примерами «абстракций» на ПК являются видеовход, принтеры, аудиовход и выход, блочные устройства (например, жесткие диски или USB-флеш-накопители ) и т. д.
В некоторых областях компьютерной науки, таких как операционные системы или встроенные системы, абстракции выглядят несколько иначе (например, операционные системы, как правило, имеют более стандартизированные интерфейсы), но концепция абстракции и инкапсуляции сложности является общей и глубокой.
Уровень абстракции оборудования находится под интерфейсом прикладного программирования (API) в программном стеке, тогда как уровень приложения (часто написанный на языке высокого уровня) находится над API и взаимодействует с оборудованием, вызывая функции в API.
Уровень абстракции оборудования ( HAL ) — это уровень абстракции , реализованный в программном обеспечении между физическим оборудованием компьютера и программным обеспечением , работающим на этом компьютере. Его функция заключается в том, чтобы скрыть различия в оборудовании от большей части ядра операционной системы , так что большую часть кода режима ядра не нужно менять для запуска на системах с другим оборудованием. В Microsoft Windows HAL можно в основном считать драйвером для материнской платы, который позволяет инструкциям из языков программирования более высокого уровня взаимодействовать с компонентами более низкого уровня, но предотвращает прямой доступ к оборудованию.
CP/M ( CP/M BIOS ), DOS ( DOS BIOS ), Solaris , Linux , BSD , macOS и некоторые другие портативные операционные системы также имеют HAL, даже если он явно не обозначен как таковой. Некоторые операционные системы, такие как Linux, имеют возможность вставлять его во время работы, как Adeos . Операционная система NetBSD широко известна как имеющая чистый уровень абстракции оборудования, что позволяет ей быть высокопортируемой. [1] Частью этой системы являются / , и другие подсистемы. Популярные шины, которые используются более чем на одной архитектуре, такие как ISA , EISA , PCI , PCIe и т. д ., также абстрагируются , что позволяет драйверам также быть высокопортируемыми с минимальной модификацией кода.
Операционные системы с определенным HAL легче переносимы на различное оборудование. Это особенно важно для встраиваемых систем , работающих на десятках различных платформ.
Ядро Windows NT имеет HAL в пространстве ядра между оборудованием и исполнительными службами, которые содержатся в файле NTOSKRNL.EXE [2] [3] в %WINDOWS%\system32\hal.dll . Это обеспечивает переносимость кода режима ядра Windows NT на множество процессоров с различными архитектурами блоков управления памятью и множество систем с различными архитектурами шин ввода-вывода; большая часть этого кода выполняется без изменений на этих системах, если она скомпилирована для набора инструкций, применимого к этим системам. Например, рабочие станции SGI Intel x86 не были совместимы с рабочими станциями IBM PC , но благодаря HAL Windows 2000 могла работать на них. [4] [ не удалось проверить ]
Начиная с Windows Vista и Windows Server 2008 , используемый HAL автоматически определяется во время запуска . [5]
«Экстремальный» пример HAL можно найти в архитектурах System/38 и AS/400 , в настоящее время реализованных в операционной системе IBM i . Большинство компиляторов для этих систем генерируют абстрактный машинный код; Лицензионный внутренний код, или LIC, транслирует этот виртуальный машинный код в машинный код для процессора, на котором он запущен, и выполняет полученный машинный код. [6] (Исключением являются компиляторы, которые генерируют сам LIC; эти компиляторы недоступны за пределами IBM.) Это было настолько успешно, что прикладное программное обеспечение и программное обеспечение операционной системы выше уровня LIC, которые были скомпилированы на оригинальном S/38, работают без изменений и без перекомпиляции на последних системах AS/400, несмотря на то, что базовое оборудование было кардинально изменено; использовались по крайней мере три различных типа процессоров. [6]
Android представил HAL, известный как «vendor interface» (кодовое название «Project Treble») в версии 8.0 «Oreo» . Он абстрагирует низкоуровневый код от фреймворка ОС Android, и они должны быть совместимы с будущими версиями Android, чтобы облегчить разработку обновлений прошивки. [7] До Project Treble Android полагался на различные нестандартизированные устаревшие HAL. [8]
Halium — это HAL на базе Android, используемый несколькими мобильными операционными системами, такими как Ubuntu Touch и LuneOS, для работы на смартфонах с предустановленной ОС Android.