Программирование 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 через «Параметры». 

  1. Откройте «Параметры».
  2. Выберите раздел «Обновление и безопасность».
  3. Перейдите во вкладку «Восстановление».
  4. В разделе «Расширенный запуск» нажмите «Перезагрузить сейчас».
  5. После перезагрузки выберите режим «Устранение неполадок».
  6. Перейдите в «Дополнительные параметры».
  7. Выберите пункт «Настройка UEFI».
  8. Снова перезапустите систему.

Машины с 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

Модель программирования UEFI

EFI_SHELL_EXECUTE

Выполнить

Заставляет Shell анализировать и выполнять командную строку.

EFI_SHELL_GET_ENV

GetEnv

Получает переменную среды.

EFI_SHELL_SET_ENV

Сетэнв

Изменяет определенную переменную среды.

EFI_SHELL_GET_ALIAS

GetAlias

Извлекает псевдоним для определенной команды оболочки.

EFI_SHELL_SET_ALIAS

СетАлиас

Добавляет или удаляет псевдоним для определенной команды оболочки.

EFI_SHELL_GET_HELP_TEXT

GetHelpText

Возвращает справочную информацию об определенной команде.

EFI_SHELL_GET_DEVICE_PATH_FROM_MAP

Жетдевицепасфроммап

Возвращает путь к устройству, соответствующий сопоставлению.

EFI_SHELL_GET_MAP_FROM_DEVICE_PATH

GetMapFromDevicePath

Возвращает сопоставление, соответствующее определенному пути к устройству.

EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH

Жетдевицепасфромфилепас

Преобразует путь к файлу в путь к устройству, где все сопоставления были заменены соответствующими путями к устройствам.

EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH

GetFilePathFromDevicePath

Преобразует путь к устройству в путь к файлу, где часть пути к устройству, соответствующая одному из сопоставлений, заменяется этим сопоставлением.

EFI_SHELL_SET_MAP

СетКарта

Создает, обновляет или удаляет сопоставление между устройством и путем к устройству.

EFI_SHELL_GET_CUR_DIR

GetCurDir

Возвращает текущий каталог на устройстве.

EFI_SHELL_SET_CUR_DIR

СетКурДир

Изменяет текущий каталог на устройстве.

EFI_SHELL_OPEN_FILE_LIST

Опенфилелист

Открывает файлы, соответствующие указанному шаблону пути.

EFI_SHELL_FREE_FILE_LIST

список фрифайлов

Освобождает список файлов, созданный функцией OpenFileList().

EFI_SHELL_REMOVE_DUP_IN_FILE_LIST

Ремоведдупинфилелист

Удаляет дубликаты файлов в заданном списке файлов.

EFI_SHELL_BATCH_IS_ACTIVE

БатчИсактиве

Показывает, обрабатываются ли какие-либо файлы сценариев.

EFI_SHELL_IS_ROOT_SHELL

Исрутшелл

Проверяет, является ли активная оболочка корневой оболочкой.

EFI_SHELL_ENABLE_PAGE_BREAK

Енаблепажебреак

Включает режим вывода разрыва страницы.

EFI_SHELL_DISABLE_PAGE_BREAK

Дисаблепажебреак

Отключает режим вывода разрыва страницы.

EFI_SHELL_GET_PAGE_BREAK

GetPageBreak

Получает статус включения режима вывода разрыва страницы.

EFI_SHELL_GET_DEVICE_NAME

GetDeviceName

Получает имя устройства, указанное дескриптором устройства.

EFI_SHELL_GET_FILE_INFO

GetFileInfo

Отображает информацию об определенном дескрипторе файла.

EFI_SHELL_SET_FILE_INFO

Сетфилеинфо

Изменяет информацию об определенном дескрипторе файла.

EFI_SHELL_OPEN_FILE_BY_NAME

Опенфилебинаме

Открывает файл, указанный по имени, и возвращает дескриптор файла.

EFI_SHELL_CLOSE_FILE

Закрыть файл

Закрывает открытый файл.

EFI_SHELL_CREATE_FILE

Создать файл

Создает новый файл.

EFI_SHELL_READ_FILE

Читать файл

Считывает данные из файла.

EFI_SHELL_WRITE_FILE

Запись файла

Записывает данные в файл.

EFI_SHELL_DELETE_FILE

УдалитьФайл

Удаляет файл.

EFI_SHELL_DELETE_FILE_BY_NAME

Удалитьфилебинаме

Удаляет файл по имени.

EFI_SHELL_GET_FILE_POSITION

Жетфилепозитион

Отображает текущую позицию чтения/записи в файле.

EFI_SHELL_SET_FILE_POSITION

Сетфилепозитион

Изменяет текущую позицию чтения/записи в файле.

EFI_SHELL_FLUSH_FILE

ФлешФайл

Записывает все буферизованные данные в файл.

EFI_SHELL_FIND_FILES

НайтиФайлы

Отображает все файлы, соответствующие шаблону в списке файлов.

EFI_SHELL_FIND_FILES_IN_DIR

FindFilesInDir

Отображает все файлы в указанном каталоге в списке файлов.

EFI_SHELL_GET_FILE_SIZE

GetFileSize

Отображает размер файла.

EFI_SHELL_OPEN_ROOT

ОпенРут

Отображает корневой каталог файловой системы.

EFI_SHELL_OPEN_ROOT_BY_HANDLE

Опенрутбайхандле

Отображает корневой каталог файловой системы для определенного дескриптора.

EFI_EVENT

Перерыв в выполнении

Событие, сигнализируемое оболочкой UEFI, когда пользователь нажимает CTRL-C, чтобы указать, что текущее выполнение команды оболочки UEFI должно быть прервано.

UINT32

Основная версия

Основная версия среды Shell.

UINT32

Младшая версия

Младшая версия среды 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, полезных для программистов.

Читайте также: