Программирование 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 или UEFI (про них позже),
- жёсткий диск.
Когда всё это заработало, системный контроллер берёт содержимое микросхемы BIOS, загружает его в оперативную память и говорит «Ну всё, дальше ты». С этого момента управление компьютером переходит к BIOS.
Загрузился BIOS
BIOS — это аббревиатура от Basic Input/Output System, базовая система ввода-вывода. Она отвечает за первоначальную загрузку компьютера. Все данные BIOS хранятся в отдельной микросхеме на материнской плате, а чтобы настройки не пропали после отключения от розетки, ставят батарейку. Если питания от сети не будет, батарейка будет поддерживать память в микросхеме около 10 лет.
Микросхема BIOS рядом с батарейкой
Первое, что делает BIOS, — запускает POST (Power On Self Test), самотестирование при включении. Тест проверяет работу процессора, оперативной памяти, контроллеров, загрузчиков и всего остального оборудования, важного для загрузки компьютера. Если всё в порядке, то компьютер пропищит один раз и продолжит загрузку — так он сообщает о результатах тестирования. А если будут ошибки — пропищит иначе, например:
- короткий и длинный — ошибка с оперативной памятью;
- длинный и 2 коротких — проблемы с видеокартой;
- постоянно длинный и короткий гудки — что-то с процессором;
- всё время пищит — ошибки с блоком питания.
Когда POST пройден, BIOS начинает искать загрузчик операционной системы. Для этого он смотрит у себя в настройках порядок загрузки — список дисков по очереди, с которых можно загрузиться. Например, вот порядок загрузки на экране BIOS компьютера Lenovo. Видно, что сначала нужно попробовать загрузиться с USB (первые три строчки), потом, если USB-дисков нет, — с жёсткого диска (п. 4), а если и диска нет — то попробовать с CD-дисковода или загрузиться по сети:
Порядок загрузки на экране BIOS компьютера Lenovo. Если нигде загрузчика не будет, BIOS остановится и выдаст ошибку
Как только загрузчик найден, BIOS считывает его код и передаёт ему всё дальнейшее управление компьютером.
Немного про UEFI
У BIOS есть проблема — устаревший интерфейс и мало возможностей для настроек компьютера. Чтобы это исправить, придумали UEFI — мини-операционную систему, которая так же, как и BIOS, может управлять основными настройками, но ещё обладает дополнительными возможностями. Например, у неё есть полноценный графический интерфейс с мышкой, расширенные возможности по настройке устройств и более полный доступ к возможностям железа.
Основное отличие от BIOS в том, что UEFI требуется больше памяти для первоначальных программ загрузки компьютера. Для этого UEFI забирает себе первые 100 мегабайт на диске и берёт эти данные оттуда, а сам раздел делает скрытым.
Работа загрузчика
Загрузчик — это сборное название всех программ и драйверов, которые понадобятся операционной системе для полноценной загрузки.
Можно провести такую аналогию: операционная система — это строительная бригада, которая может сделать что угодно. Но для её работы нужен менеджер, чтобы он заранее съездил к заказчику, выяснил, что нужно сделать, составил смету, закупил материалы и прикинул график работ. Загрузчик — это как раз тот самый менеджер, который делает все предварительные работы. Если менеджер не сделает свою часть, бригада не сможет приступить к работам.
Сам загрузчик находится на жёстком диске, и как только BIOS его находит и отправляет в оперативную память, загрузчик начинает действовать:
Экзотические виды памяти
- включает нужный режим работы процессора, который защищает одни процессы от других;
- распределяет оперативную память и сгружает туда файл с параметрами загрузки операционной системы;
- загружает драйверы устройств и проверяет их цифровую подпись;
- подключает файловую систему, чтобы компьютер мог полноценно работать со всеми дисками.
На финальном этапе загрузчик находит ядро операционной системы, загружает его в память и передаёт управление ему.
Запуск ядра операционной системы
Если процесс загрузки дошёл до этой точки, то компьютер понимает, что скоро загрузится операционная система, а значит, можно показать пользователю стартовый экран. На Windows он выглядит так:
Пока крутится индикатор загрузки, ядро занимается тем, что загружает и запускает все служебные программы и скрипты:
- смотрит, какое подключено железо и какие драйверы для него нужны прямо сейчас;
- считывает настройки системы и запускает скрипты сразу с нужными параметрами;
- запускает службы и демоны;
- настраивает графический интерфейс;
- включает систему входа пользователей в систему.
Смысл ядра — запустить все программы, которые будут нужны для дальнейшей работы операционной системы. В нашей аналогии со строительной бригадой, ядро — это прораб, который находится всё время на объекте от начала работ до их полного окончания. Прораб следит за ключевыми процессами и вмешивается, если что-то идёт не так. Ядро действует точно так же: обеспечивает работоспособность всей ОС и регулирует ключевые процессы.
Вход пользователя в систему
Последний шаг загрузки компьютера — вход пользователя в систему. Он может быть автоматическим, если нет пароля на вход — в противном случае система попросит его ввести:
После входа операционная система загружает все пользовательские настройки и программы — ставит нужный фон на рабочий стол, применяет какую-то схему оформления и запускает те программы, которые выбрал этот пользователь.
И всё.
Текст:
Михаил Полянин
Редактор:
Максим Ильяхов
Художник:
Алексей Сухов
Корректор:
Ирина Михеева
Вёрстка:
Кирилл Климентьев
Соцсети:
Виталий Вебер
| Выполнить | Заставляет Shell анализировать и выполнять командную строку. |
| GetEnv | Получает переменную среды. |
| Сетэнв | Изменяет определенную переменную среды. |
| GetAlias | Извлекает псевдоним для определенной команды оболочки. |
| SetAlias | Добавляет или удаляет псевдоним для определенной команды оболочки. |
| GetHelpText | Возвращает справочную информацию об определенной команде. |
| GetDevicePathFromMap | Возвращает путь к устройству, соответствующий сопоставлению. |
| GetMapFromDevicePath | Возвращает сопоставление, соответствующее определенному пути устройства. |
| GetDevicePathFromFilePath | Преобразует путь к файлу в путь к устройству, где все сопоставления заменены соответствующими путями к устройствам. |
| GetFilePathFromDevicePath | Преобразует путь к устройству в путь к файлу, где часть пути к устройству, соответствующая одному из сопоставлений, заменяется этим сопоставлением. |
| SetMap | Создает, обновляет или удаляет сопоставление между устройством и путем к устройству. |
| GetCurDir | Возвращает текущий каталог на устройстве. |
| СетКурДир | Изменяет текущий каталог на устройстве. |
| OpenFileList | Открывает файлы, соответствующие указанному шаблону пути. |
| Свободный список файлов | Освобождает список файлов, созданный функцией OpenFileList(). |
| УдалитьDupInFileList | Удаляет дубликаты файлов в заданном списке файлов. |
| BatchIsActive | Показывает, обрабатываются ли какие-либо файлы сценариев. |
| Исрутшелл | Проверяет, является ли активная оболочка корневой оболочкой. |
| Енаблепажебреак | Включает режим вывода разрыва страницы. |
| Дисаблеразрыв страницы | Отключает режим вывода разрыва страницы. |
| GetPageBreak | Получает статус включения режима вывода разрыва страницы. |
| GetDeviceName | Получает имя устройства, указанное дескриптором устройства. |
| GetFileInfo | Отображает информацию об определенном дескрипторе файла. |
| Сетфилеинфо | Изменяет информацию об определенном дескрипторе файла. |
| OpenFileByName | Открывает файл, указанный по имени, и возвращает дескриптор файла. |
| Закрыть файл | Закрывает открытый файл. |
| Создать файл | Создает новый файл. |
| Читать файл | Считывает данные из файла. |
| Запись в файл | Записывает данные в файл. |
| УдалитьФайл | Удаляет файл. |
| DeleteFileByName | Удаляет файл по имени. |
| GetFilePosition | Отображает текущую позицию чтения/записи в файле. |
| Сетфилепозитион | Изменяет текущую позицию чтения/записи в файле. |
| ФлешФайл | Записывает все буферизованные данные в файл. |
| НайтиФайлы | Отображает все файлы, соответствующие шаблону в списке файлов. |
| 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, полезных для программистов.