Пожалуй, пора поставить точку в этой теме.
Дисковые операции UEFI, как оказалось, обладают парой особенностей: 1. Адрес буфера в памяти и адрес строки имени файла усекается до 32 бит. Это тем более непонятно, что функции ввода и вывода на экран этим не страдают. 2. При обновлении файла с увеличением его размера наблюдается любопытный эффект: по смещению старого конца файла начинается повторная запись с начала буфера, в цикле. Единственный выход: указатель на начало, переписать старое содержимое, указатель на конец, записать остаток. Смешно, но работает железно.
Распределение памяти: первый гиг лучше не трогать - там таблицы UEFI, туда же грузятся драйверы, приложения (включая Ваше); первый мегабайт - святое, его даже UEFI стороной обходит; с начала четвёртого гигабайта - MMIO, середина - UEFI (16 Мб), конец - BIOS.
Для программирования под UEFI не нужны никакие монструозные тулкиты. Нужен любой компилятор Си или транслятор ассемблера x86-64. И всё. Берём флэшку с FAT32 (можно и с диска), неважно что там ещё. Кладём на неё файл /EFI/BOOT/BOOTx64.EFI. Перегружаемся.
Получаем псевдо-текстовой видеорежим 25x80, функции ввода/вывода - сплошной юникод, русские символы есть все. Функции - от ACPI до TCP/IP, работа с графикой, формы. Если Ваша ОС умеет больше, можно уйти в runtime, но вовсе не обязательно.
Надеюсь, эта информация кому-нибудь пригодится.
|