Что такое BIOS/UEFI простым языком
BIOS (классика) — это маленькая прошивка, которая при включении выполняет тесты (POST), инициализирует железо и передаёт управление загрузчику ОС. Раньше это был действительно небольшой кусок кода, часто в ассемблере.
UEFI (современный эквивалент) — выполняет те же базовые функции, но гораздо богаче: модульная архитектура, драйверы, поддержка файловых систем, сетевой загрузки, графического интерфейса, подписей кода (Secure Boot) и пр. Большая часть пишется на C, не на чистом асме.
Что реально «переписать» и почему это сложно
Есть «ядро» задач — тест, инициализация, запуск загрузчика. Но внутри этого ядра куча слоёв, которые завязаны на конкретное железо и на экосистему:
Инициализация процессора и кэшей — очень низкоуровневый код (часто ассемблер), зависит от архитектуры (x86, ARM, RISC-V, LoongArch).
Инициализация контроллеров (PCIe, SATA, NVMe, USB, сетевухи, чиплет-интерконнекты) — нужны драйверы/модули под конкретные чипы. Их писать/тестировать непросто.
POST/диагностика — простая идея, но множество проверок и обработка ошибок (и их корректная интерпретация) — не тривиально.
Загрузчик/boot services — поддержка разных форматов (EFI, legacy), сетевой boot, загрузка из разных файловых систем.
Безопасность — цепочка доверия, подпись прошивок, Secure Boot, TPM/функции платформенной безопасности. Это сложная логика и инфраструктура ключей.
Производственные/серийные вещи — прошивку нужно уметь безопасно обновлять, откатывать, шифровать, подписывать. Ошибка — кирпич матплаты.
Сопутствующие микроконтроллеры — Intel ME/AMD PSP/Apple T2/бортовые BMC/EC — у платформ есть отдельные контроллеры, которые тоже взаимодействуют с прошивкой. Их нельзя просто игнорировать.
Совместимость экосистемы — ОСы, гипервизоры, утилиты и драйверы ожидают определённого поведения UEFI/BIOS. «Своя» прошивка должна поддерживать эти ожидания или ломать совместимость.
В общем не так это просто.
Кстати писать драйвера тоже очень не просто.
Драйвер — это как переводчик между «железом, которое думает на электричестве», и «операционкой, которая думает на абстракциях». И вот почему это реально адская работа:
Близость к железу.
Ошибка — и не просто программа падает, а весь комп в «синий экран» или в ребут. Там нет «безопасной песочницы».
Сложность документации.
Часто спецификации железа частично закрыты, неполные или противоречивые. Иногда разработчики драйверов тупо «допытываются» поведение железки методом проб и ошибок.
Огромное разнообразие платформ.
Устройства, чипсеты, контроллеры, архитектуры, версии ОС — нужно, чтобы всё это как-то дружило.
Синхронизация и прерывания.
Нужно уметь грамотно работать с многопоточностью, DMA, таймингами, прерываниями — на уровне микросекунд. Ошибка — и всё виснет.
Производительность.
Каждый лишний вызов или задержка — и видеокарта теряет FPS, SSD падает в скорости, сеть заикается.
Совместимость и подписи.
Особенно в Windows: драйвер должен быть подписан, безопасен, не конфликтовать с другими. Это ещё один слой головной боли.
Так что да — писать драйверы считается одной из самых «хардкорных» задач в прикладном программировании.
Недаром у Intel, AMD, NVIDIA, Realtek и прочих под это целые отдельные команды, и ни один нормальный программист не полезет туда «попробовать ради интереса» — если только не мазохист или не гений.