Итак, снова, здравствуйте мои много и по-разному уважаемые!

Итак, снова, здравствуйте мои много и по-разному уважаемые! Надеюсь, толпы читающих сии опусы достигают в перигее лишь моего монитора (паршивенький, честно сказать, но таки цельных 20 импортных сантиметров), потому позволю себе расслабабиться (неплохая очепятка, можно и оставить) чутка вечерним словоблудием на между и околотехнические темы.
Итак, о чём это мы. Ах, да, EFI, будь он(о) неладно. Так вот, скажу я вам, что эту штуку явно накрапали не программеры, а самые что ни на есть прокилограммеры. Всё складывается, всё раскладывается так, просто держись. Закончили, насколько понятно, на матрёшках и капсулах. С капсулами, кто и зачем её породил – вроде ясно. А вот с матрёшками нужно будет поднапрячься иначе никак. Главная задумка всех этих матрёшек – стандартизирования сборки EFI под новомодные компиляторы. Нонче в них рулят xml, потому всё должно как можно более универсальней описано и иметь вариантик на любой, даже самый больной случай. Хотя, конечно, я тут подумал, возможно, это больше важно будет для тех, кто задумает написать свою программулину для работы с EFI.

Если это ты, будущий EFI-программер, то заранее тебе сочувствую. Ты наивно думаешь, что в EFI есть лишь два варианта упаковки модулей – “Standard compression” (типа 0) и “Tiano compression” (типа 1)? Так написано в даташитах? Да, верно, написано. Но, как любил говаривать наш прапорщик - «На заборе тоже написано, а там танки стоят». А про третью поправку восьмого исправления четвёртой редакции от 32 мая того года – ничегось не слышал? Так вот, там чётко тёмным по светлому написано – в военное время не только прямой угол достигает 100 градусов, но и бит типа компрессии может достигать двойки. И самое противное: где, кто и когда объявляет военное положение – неизвестно даже упомянутому прапорщику.
Мораль у этой короткой военно-патриотической басни такова – даже нули и единицы каждый из BIOS-писателей могут трактовать по-своему, что уж говорить про остальное…

Но, всё же, чтобы совсем уж не уйти от технических моментов, остановимся на компрессии. Жмутся в EFI секции, для которых и предусмотрен конкретный тип таковых. В роли компрессии выступает недалеко ушедший от «классического» LZINT-метода компрессии (т.е. такого же, как используется в Award/AMI /Phoenix) алгоритм с двумя, отличающимися лишь «тонкими» настройками подвариантами (разные дефайны некоторых констант), которые именуются как Standard Compression и Tiano Compression. Обычно жмутся лишь «конечные» модули, однако секции (в плане - содержащие внутри себя другие матрёшки) тоже жмутся. Хоть, как бы особо не должны (но об этом уже было выше).

Т.е. смысл простой, типы секций могут быть (обратимся к первоисточнику):


//
// ////////////////////////////////////////////////////////////////////////////
//
// Section types
//
typedef UINT8 EFI_SECTION_TYPE;
//
// ************************************************************
// The section type EFI_SECTION_ALL is a psuedo type.  It is
// used as a wildcard when retrieving sections.  The section
// type EFI_SECTION_ALL matches all section types.
// ************************************************************
//
#define EFI_SECTION_ALL 0x00
//
// ************************************************************
// Encapsulation section Type values
// ************************************************************
//
#define EFI_SECTION_COMPRESSION   0x01
#define EFI_SECTION_GUID_DEFINED  0x02
//
// ************************************************************
// Leaf section Type values
// ************************************************************
//
#define EFI_SECTION_FIRST_LEAF_SECTION_TYPE 0x10

#define EFI_SECTION_PE32                    0x10
#define EFI_SECTION_PIC                     0x11
#define EFI_SECTION_TE                      0x12
#define EFI_SECTION_DXE_DEPEX               0x13
#define EFI_SECTION_VERSION                 0x14
#define EFI_SECTION_USER_INTERFACE          0x15
#define EFI_SECTION_COMPATIBILITY16         0x16
#define EFI_SECTION_FIRMWARE_VOLUME_IMAGE   0x17
#define EFI_SECTION_FREEFORM_SUBTYPE_GUID   0x18
#define EFI_SECTION_RAW                     0x19
#define EFI_SECTION_PEI_DEPEX               0x1B

#define EFI_SECTION_LAST_LEAF_SECTION_TYPE  0x1B
#define EFI_SECTION_LAST_SECTION_TYPE       0x1B

Как видно, если тип секции равен единице, значит она пожатая. Также ещё видно, что валидные типы это 1, 2, 0x10-0x1B. Однако сразу нужно дополнить, что по всё тому же правилу военного буравчика к этому списку нужно приплюсовать 0x00, 0x1C и 0xFF.
Самые важные типы – 0x10, который обозначает, что в секции находится PE32-модуль и 0x17, который обозначает, что внутри её матрёшка раздела - FV. Тип секции 0x19 обозначает, что в ней лежат «просто данные», часто это какие-то «внешние», не используемые непосредственно EFIBIOS данные (например, нужные для прошивальщика и т.п.), а также картинки/логотипчики. В секции 0x15 лежит (если она есть, конечно) «человеческое» название модуля, т.е. просто его название. Несмотря на подобную заботу о людях в реальности BIOS-писатели её успешно не пользуются и «человеческие» названия являются исключением, а не правилом (если их не «выуживать» другими способами, как в указанных выше на картинках). Секция 0x16 пусть особо не возбуждает ваше воображение, ибо ничего особо полезного «совместимого» там нету и предназначена она для 16-битного SMM-обработчика. Модуль 0x12-того типа (то есть тип секции, который его и определяет) есть «недомодуль PE32-типа», который отличается более упрощённым заголовком и предназначен для исполняемых файлов на PEI-стадии (т.е. в проекции на BIOS – _исполняемый_ модуль для BootBlock-а).
…Так, а ведь про стадии то я и не рассказал. А где, собственно, начальник транспортного цеха?!?...