Программирование uefi: Пишем для UEFI BIOS в Visual Studio. Часть 1 — разворачивание среды разработки, компиляция и запуск на отладку / Хабр
Содержание
Как запустить сервер: UEFI | Блог Timeweb Cloud
Unified Extensible Firmware Interface (UEFI) — это спецификация программы, которая соединяет прошивку компьютера с его операционной системой. Ожидается, что UEFI в итоге заменит базовую систему ввода/вывода — BIOS. Пока же он совместим с ней. Это нужно для того, чтобы не было проблем с запуском старых операционных систем, у которых нет поддержки UEFI Boot.
UEFI работает через специальную прошивку, установленную на материнской плате компьютера. Как и BIOS, UEFI является первой программой, которая запускается при включении компьютера. Она проверяет, какие устройства подключены, пробуждает компоненты и передает их операционной системе.
Новая спецификация решает некоторые проблемы, свойственные BIOS. Например, ограничение на размер раздела жесткого диска. Кроме того, загрузка UEFI происходит быстрее. Это напрямую влияет на пользовательский опыт.
Что конкретно делает UEFI
UEFI определяет взаимодействие операционной системы и платформы, предоставляя облегченную альтернативу BIOS. Используется только информация, необходимая для запуска процесса загрузки ОС. Кроме того, обеспечиваются расширенные функции безопасности.
Важный момент — совместимость UEFI с BIOS. Поддерживается большинство операционных систем. Это дает администраторам гибкость при выборе платформы. Кроме того, разработчики оборудования могут добавлять свои приложения и драйверы.
UEFI содержит таблицы данных, связанные с платформой, а также вызовы службы загрузки и выполнения, которые использует загрузчик ОС. В совокупности эта информация определяет необходимые интерфейсы и структуры, которые должны быть реализованы, чтобы микропрограммы и аппаратные устройства поддерживали режим загрузки UEFI.
В целом, BIOS считается устаревшей технологией, тогда как UEFI — это будущее. Однако для простоты понимания некоторые пользователи называют процессы собирательно (BIOS UEFI), несмотря на их существенные различия.
Эволюция от EFI к UEFI
В 1981 году IBM стала первым поставщиком, внедрившим BIOS в ПК. Появление UEFI происходит параллельно с увеличением плотности дисков, используемых для рабочих нагрузок современных приложений.
Но что такое EFI? Intel представила Extensible Firmware Interface (EFI) как результат работы над 64-разрядной серверной архитектурой Itanium в 1990-х годах. Эта технология разрабатывалась совместно с производителем компьютеров Hewlett Packard (HP).
Специалисты восприняли EFI/UEFI как возможность устранить недостатки BIOS. Ограничения включали 16-битный режим вычислений, ограниченную системную память и утомительное программирование на языке ассемблера.
EFI, впоследствии переименованная в Intel Boot Initiative, технически остается собственностью Intel. Однако компания прекратила единоличную разработку спецификации после выпуска EFI версии 1.10 в 2005 году. Эта версия и была представлена для объединения поставщиков чипсетов, оборудования, систем, прошивок и ОС.
Разработкой стандартов спецификации UEFI с тех пор управляет отраслевой консорциум. Последний стандарт, UEFI 2.9, стал общедоступным в марте 2021 года.
Сравнение BIOS и UEFI
Включение компьютера запускает цепочку событий, которые происходят до загрузки ОС. Они занимают считанные мгновения, многие о них даже не задумываются. Для их понимания важно знать, что такое UEFI Boot и чем он отличается от BIOS.
Глобально процесс можно описать так: прошивка запускает подсистему компьютера для выполнения серии тестов и находит загрузчик, который, в свою очередь, запускает ядро ОС. Это актуально и для персональных компьютеров, которые работают у нас дома, и для мощных серверов на cloud.timeweb.com. Но реализация этих действий может быть разной.
Загрузка BIOS
BIOS находится на микросхеме материнской платы машины и инициализирует центральный процессор, оперативную память, карты PCIe (Peripheral Component Interconnect Express) и сетевые устройства. Затем он запускает самотестирование при включении питания (Power On Self Test — POST). POST гарантирует, что оборудование настроено правильно, а все компоненты работают должным образом.
BIOS работает только в режиме 16-битного процессора. Это ограничивает количество команд, которые микропрограмма может выполнять в любой момент времени. Для выполнения задач выделяется 1 мегабайт памяти. Таким образом, интерфейсы и устройства инициализируются последовательно, из-за чего скорость запуска остается невысокой.
Для решения своих задач BIOS обращается к основной загрузочной записи (MBR), чтобы найти ОС и запустить загрузчик. MBR использует 32-битные значения для описания смещения и длины раздела. Из-за этого существует ограничение на диски — емкость не более двух терабайт и не более четырех разделов.
Загрузка UEFI
UEFI ведет себя как миниатюрная ОС, которая находится между прошивкой и основной ОС. Он выполняет ту же диагностику, что и BIOS при запуске, но предлагает большую гибкость.
UEFI хранит данные инициализации в файловом разделе EFI в флэш-памяти, а не в прошивке. Это позволяет запускаться во время загрузки с диска или с сетевого ресурса. Главный плюс использования EFI system partition, что это независимый от ОС раздел.
UEFI также развертывает более гибкую схему секционирования, чем MBR, известную как таблица разделов с глобальным уникальным идентификатором или GPT. Это своеобразная замена UEFI MBR. GPT был создан Intel как часть EFI. Он использует 64-битные значения для создания до 128 разделов и требуется для систем, запускаемых с дисков емкостью даже более двух терабайт.
Большинство новых настольных ПК, ноутбуков и некоторых планшетов комплектуются прошивкой UEFI, которая работает в режиме поддержки совместимости со старыми 32-разрядными версиями Windows. Ожидается, что производители компьютеров будут поддерживать BIOS и в ближайшем будущем, но переход на UEFI уже идет полным ходом.
В 2013 году управление Advanced Configuration and Power Interface (ACPI) было передано UEFI Forum. Первоначально разработанный совместно HP, Intel, Microsoft, Phoenix Technologies и Toshiba, ACPI представляет собой открытый стандарт для BIOS, который определяет, сколько энергии подается на каждое периферийное устройство.
Утилиты для материнской платы или системы для доступа к UEFI/BIOS различаются от поставщика к поставщику и по внешнему виду, но с точки зрения функциональности практически идентичны.
Преимущества UEFI
UEFI предоставляет множество значительных улучшений по сравнению с BIOS. Рассмотрим основные:
- Пользователи Windows могут использовать 32-разрядный или 64-разрядный режим. Однако эксперты рекомендуют применять одинаковую разрядность ОС и встроенной прошивки, чтобы избежать проблем с совместимостью во время выполнения процессов.
- Поддерживаются загрузочные диски емкостью 2,2 ТБ и выше, включая накопители теоретической емкостью 9,4 зеттабайта. Это намного превышает максимальную емкость дисков, доступную в настоящее время.
- UEFI поддерживает дискретные драйверы, тогда как поддержка дисков BIOS хранится в постоянной памяти, что требует настройки для совместимости при замене дисков или внесении изменений.
- Графический пользовательский интерфейс упрощает добавление новых модулей, включая драйверы устройств для материнской платы и подключенных периферийных устройств. Для выполнения *.efi файлов и загрузчиков также есть командная оболочка UEFI Shell. Через EFI Shell установка Windows и других ОС не выполняется. Однако ее часто используют для работы с сетью, загрузки драйверов, выполнения различных сценариев.
- В то время как BIOS позволяет использовать один загрузчик, UEFI дает пользователям возможность устанавливать загрузчики для Ubuntu на основе Debian и других вариантов Linux вместе с загрузчиками ОС Windows в том же системном разделе EFI. Это удобно, если вы хотите использовать на одном компьютере несколько операционных систем и выбирать при запуске, какую следует загрузить.
- Прошивка UEFI написана преимущественно на языке C, что позволяет пользователям добавлять или удалять функции с меньшим количеством программирования, чем BIOS, написанный на языке ассемблера с вкраплениями кода на языке C.
- Безопасная загрузка делает микропрограмму системы корнем доверия для проверки целостности устройства и системы. Цель состоит в том, чтобы предотвратить установку хакерами руткитов в период между загрузкой и передачей в ОС. Безопасная загрузка также позволяет авторизованному пользователю удаленно настраивать сети и устранять неполадки.
Поскольку производители компьютеров постепенно отказываются от BIOS, они обычно интегрируют прошивку UEFI, которая работает с модулем поддержки совместимости (CSM) в современных устройствах. Хотя CSM не задумывался как долгосрочное решение, он позволяет компьютерам запускаться в устаревшем режиме BIOS для работы со старыми версиями Windows и другими операционными системами.
Недостатки UEFI
Программное обеспечение всегда является целью злоумышленников. UEFI не является исключением. Одна из таких атак, получившая название TrickBot, была обнаружена в декабре 2020 года. Вредоносная программа шпионит за прошивкой устройства, что может позволить злоумышленникам нарушить процесс загрузки и получить доступ к ОС.
Помимо проблем с безопасностью, организации, переходящие на UEFI, могут понести расходы, связанные с загрузкой с флэш-памяти. Хотя это быстрее, чем загрузка с жестких дисков, для более старых систем может потребоваться модернизация, а именно увеличение флэш-памяти на материнской плате.
Еще одним потенциальным недостатком является зависимость UEFI от формата файловой системы FAT, который поддерживается операционной системой. Большие разделы диска могут добавить слишком много системных издержек, тем самым сводя на нет некоторые преимущества производительности. Это пример, в котором BIOS может быть более полезным вариантом, особенно для компьютера с более старой версией ОС и меньшими загрузочными дисками.
Эти недостатки следует учитывать при выборе между UEFI и BIOS. Однако в общем случае использовать BIOS невыгодно, особенно учитывая обратную совместимость UEFI со старыми операционными системами.
Как понять, что используется на машине
Чтобы определить, загружается ли компьютер из BIOS или UEFI, нажмите клавиши Windows и R на клавиатуре. В ответ откроется окно конфигурации «Выполнить». Введите MSInfo32 в диалоговом окне и нажмите клавишу Enter. Появится экран сводки системы. Найдите запись под названием BIOS Mode. Если значение говорит Legacy, система использует BIOS. Legacy UEFI не существует.
Пользователи Windows могут получить доступ к настройкам UEFI через «Параметры».
- Откройте «Параметры».
- Выберите раздел «Обновление и безопасность».
- Перейдите во вкладку «Восстановление».
- В разделе «Расширенный запуск» нажмите «Перезагрузить сейчас».
- После перезагрузки выберите режим «Устранение неполадок».
- Перейдите в «Дополнительные параметры».
- Выберите пункт «Настройка UEFI».
- Снова перезапустите систему.
Машины с UEFI Linux можно определить по каталогу sys/firmware/efi. Это также будет отражено в диспетчере загрузки Linux Grand Unified Bootloader (GRUB) в качестве указания типа grub-efi. Для машин с BIOS используется запись grub-pc.
Заключение
Мы разобрали, что такое UEFI и Legacy, чем они различаются и как работает обратная совместимость. Теперь вы понимаете процесс загрузки любой операционной системы на более глубоком уровне. Эти знания помогают не только обнаруживать и устранять неполадки, но и более эффективно использовать возможности оборудования.
Несмотря на то, что UEFI объективно более современная и удобная спецификация, совсем отказаться от BIOS пока не удается. Это связано и с широким распространением старых операционных систем, и возможным ростом затрат на обновление оборудование. Тем не менее специалисты считают, что UEFI Boot — это будущее.
Системное программирование
Предыдущий раздел | Оглавление | Следующий раздел |
Для начала работы операционной системы необходимо выполнить несколько шагов. Когда компьютер включается,
оборудование инициализирует процессор, который начинает выполнять программу в памяти. Однако единственным доступным
кодом в этот момент является код в энергонезависимой памяти, который инициализируется изготовителем компьютера и иногда
обновляется пользователем путем перепрошивки. Поскольку программа сохраняется в памяти и обновляется крайне редко,
она называется прошивкой. Прошивка загружается на персональные компьютеры производителем либо материнской платы, либо
компьютерной системы. Исторически сложилось так, что прошивкой персонального компьютера была программа под названием BIOS
(Basic Input/Output System — базовая система ввода-вывода), но на самых новых компьютерах используется UEFI
(Unified Extensible Firmware Interface — унифицированный расширяемый интерфейс прошивки). UEFI является улучшением
BIOS за счет поддержки современного оборудования, предоставления более модульной, не зависимой от типа центрального
процессора архитектуры и поддержки расширяемой модели, упрощающей начальную загрузку по сети, подготовку к работе новых
машин и запуск диагностики.
Главное предназначение любой прошивки — запуск операционной системы путем начальной загрузки небольшой специальной программы,
которая находит начало дисковых разделов. Программы начальной загрузки Windows знают, как считать достаточно информации с тома файловой
системы или сети, чтобы найти автономную Windows-программу BootMgr. Программа BootMgr определяет, была ли система ранее переведена в
состояние гибернации или ожидания. Если это так, то BootMgr загружает и выполняет WinResume.exe. В противном случае она загружает и
выполняет WinLoad.exe для выполнения новой загрузки. WinLoad загружает в память загрузочные компоненты системы: ядро и программу
исполнительного уровня (обычно это ntoskrnl.exe), HAL (hal.dll), содержащий раздел SYSTEM файл, драйвер Win32k.sys (содержащий части
режима ядра подсистемы Win32), а также образы любых других драйверов, которые перечислены в разделе SYSTEM как загрузочные драйверы
(boot drivers). Если в системе имеется включенный Hyper-V, WinLoad также загружает и запускает программу гипервизора.
После загрузки в память загрузочных компонентов Windows управление передается коду низкого уровня в NTOS, который начинает
инициализировать HAL, ядро и исполнительный уровень, привязывать образы драйверов, а также обращаться к данным конфигурации в разделе
SYSTEM (и обновлять их). После инициализации всех компонентов режима ядра создается первый процесс пользовательского режима.
Загрузочные программы Windows могут обработать часто встречающиеся при загрузке проблемы. Иногда инсталляция плохого драйвера
устройства или использование программы вроде regedit (которая может повредить раздел SYSTEM) могут привести к невозможности нормальной
загрузки системы. Есть возможность проигнорировать недавно внесенные изменения и загрузиться с последней хорошей конфигурацией системы.
Есть и другие варианты загрузки: в безопасном режиме (safe-boot), когда отключается множество необязательных драйверов, через консоль
восстановления (recovery console), когда появляется окно командной строки cmd. exe.
Предыдущий раздел | Оглавление | Следующий раздел |
- Стиль 1
- Стиль 2
| Выполнить | Заставляет Shell анализировать и выполнять командную строку. |
| GetEnv | Получает переменную среды. |
| Сетэнв | Изменяет определенную переменную среды. |
| GetAlias | Извлекает псевдоним для определенной команды оболочки. |
| СетАлиас | Добавляет или удаляет псевдоним для определенной команды оболочки. |
| GetHelpText | Возвращает справочную информацию об определенной команде. |
| Жетдевицепасфроммап | Возвращает путь к устройству, соответствующий сопоставлению. |
| GetMapFromDevicePath | Возвращает сопоставление, соответствующее определенному пути к устройству. |
| Жетдевицепасфромфилепас | Преобразует путь к файлу в путь к устройству, где все сопоставления были заменены соответствующими путями к устройствам. |
| GetFilePathFromDevicePath | Преобразует путь к устройству в путь к файлу, где часть пути к устройству, соответствующая одному из сопоставлений, заменяется этим сопоставлением. |
| СетКарта | Создает, обновляет или удаляет сопоставление между устройством и путем к устройству. |
| GetCurDir | Возвращает текущий каталог на устройстве. |
| СетКурДир | Изменяет текущий каталог на устройстве. |
| Опенфилелист | Открывает файлы, соответствующие указанному шаблону пути. |
| список фрифайлов | Освобождает список файлов, созданный функцией OpenFileList(). |
| Ремоведдупинфилелист | Удаляет дубликаты файлов в заданном списке файлов. |
| БатчИсактиве | Показывает, обрабатываются ли какие-либо файлы сценариев. |
| Исрутшелл | Проверяет, является ли активная оболочка корневой оболочкой. |
| Енаблепажебреак | Включает режим вывода разрыва страницы. |
| Дисаблепажебреак | Отключает режим вывода разрыва страницы. |
| GetPageBreak | Получает статус включения режима вывода разрыва страницы. |
| GetDeviceName | Получает имя устройства, указанное дескриптором устройства. |
| GetFileInfo | Отображает информацию об определенном дескрипторе файла. |
| Сетфилеинфо | Изменяет информацию об определенном дескрипторе файла. |
| Опенфилебинаме | Открывает файл, указанный по имени, и возвращает дескриптор файла. |
| Закрыть файл | Закрывает открытый файл. |
| Создать файл | Создает новый файл. |
| Читать файл | Считывает данные из файла. |
| Запись файла | Записывает данные в файл. |
| УдалитьФайл | Удаляет файл. |
| Удалитьфилебинаме | Удаляет файл по имени. |
| Жетфилепозитион | Отображает текущую позицию чтения/записи в файле. |
| Сетфилепозитион | Изменяет текущую позицию чтения/записи в файле. |
| ФлешФайл | Записывает все буферизованные данные в файл. |
| НайтиФайлы | Отображает все файлы, соответствующие шаблону в списке файлов. |
| FindFilesInDir | Отображает все файлы в указанном каталоге в списке файлов. |
| GetFileSize | Отображает размер файла. |
| ОпенРут | Отображает корневой каталог файловой системы. |
| Опенрутбайхандле | Отображает корневой каталог файловой системы для определенного дескриптора. |
| Перерыв в выполнении | Событие, сигнализируемое оболочкой UEFI, когда пользователь нажимает CTRL-C, чтобы указать, что текущее выполнение команды оболочки UEFI должно быть прервано. |
| Основная версия | Основная версия среды Shell. |
| Младшая версия | Младшая версия среды Shell. |
Программирование для EFI
Программирование для EFI
Родерик В. Смит, [email protected]
Первоначально написано: 03.05.2013
Я технический писатель и консультант, специализирующийся на технологиях Linux. Эта веб-страница предоставляется бесплатно и без назойливой внешней рекламы; однако я потратил время на его подготовку, а веб-хостинг действительно стоит денег. Если вы считаете эту веб-страницу полезной, подумайте о том, чтобы сделать небольшое пожертвование, чтобы помочь поддерживать этот сайт в рабочем состоянии. Спасибо!
Пожертвовать $1.00 | Пожертвовать $2,50 | Пожертвовать $5.00 | Пожертвовать $10.00 | Пожертвовать другое значение |
Введение
Технически подкованные люди знают Extensible Firmware Interface (EFI) и его новый вариант Unified EFI (UEFI) как замену старой базовой системы ввода-вывода (BIOS) на ПК и других компьютерах. Возможно, вы не знаете, что EFI — это сложная программная среда, сравнимая по размеру и функциям с простой ОС, такой как DOS. Таким образом, EFI может размещать множество программ, но эти программы не могут появиться полностью сформированными, как Афина из головы Зевса. Скорее, они должны быть написаны отдельными лицами.
Этот набор веб-страниц предназначен для тех, кто хочет писать программы EFI. Я предполагаю, что вы уже знакомы с программированием на C. Я также использую систему Linux в качестве эталонной платформы для разработки, хотя теоретически описанные здесь программы и процедуры можно использовать и в OS X или Windows. Эти страницы лишь касаются поверхности программирования EFI; они помогут вам начать работу, но вам нужно будет узнать гораздо больше, чтобы написать значимую программу. Если вы хотите, чтобы я продолжил эту серию, пожалуйста, сделайте пожертвование (и не стесняйтесь писать мне, предлагая темы)!
Темы:
- Зачем писать для EFI?
- Подготовка среды разработки
- Создание программы «Hello, World»
- Использование служб EFI
Ссылки и дополнительная информация
- Информационные веб-страницы
- Phoenix Technologies поддерживает вики по темам EFI, включая информацию о многих системных вызовах EFI, полезных для программистов.
- Phoenix Technologies поддерживает вики по темам EFI, включая информацию о многих системных вызовах EFI, полезных для программистов.