Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Основные принципы системной разработки > Запуск системы, быстрая активация устройств > Построение встраиваемых систем > API библиотек libipl и libstartup > struct startup_header



struct startup_header

Загрузочный заголовок IPL

Прототип:

#include <sys/startup.h>
/*
* IPL - используется только в IPL
* startup - используется только в startup
*/
struct startup_header {
unsigned int signature; /* IPL */
unsigned short version; /* IPL */
unsigned char flags1; /* IPL + startup */
unsigned char flags2;
unsigned short header_size; /* startup */
unsigned short machine; /* IPL + startup */
unsigned int startup_vaddr; /* IPL */
unsigned int paddr_bias; /* startup */
unsigned int image_paddr; /* IPL + startup */
unsigned int ram_paddr; /* IPL + startup */
unsigned int ram_size; /* startup */
unsigned int startup_size; /* IPL */
unsigned int stored_size; /* IPL */
unsigned int imagefs_paddr; /* IPL + startup */
unsigned int imagefs_size; /* startup */
unsigned short preboot_size; /* IPL */
unsigned short zero0;
unsigned int zero[3];
unsigned int info[48]; /* IPL + startup */
};

Библиотека:

libstartup

Описание:

Структура загрузочного заголовка struct startup_header определена в файле <sys/startup.h>.

Корректность загрузочного образа проверяется путем вычисления контрольной суммы всего образа с помощью функции checksum():

checksum( image_paddr, startup_size );
checksum( image_paddr + startup_size, stored_size - startup_size );

Структура имеет размер 256 байт и содержит следующие поля, которые считываются IPL и/или модулем startup-*:

signature
Первые 32 бита заголовка, которые всегда содержат значение 0x00FF7EEB в порядке следования байт на платформе. Это значение идентифицирует заголовок. Если в системе возможен как прямой, так и обратный порядок следования байт, он обычно задается с помощью перемычки на плате.
version
Версия mkifs, с помощью которой был создан образ.
flags1
Поле содержит следующие флаги:

STARTUP_HDR_FLAGS1_VIRTUAL
Если этот флаг установлен, операционная система выполняется с включенным блоком управления памятью.

Note: В текущей версии ЗОСРВ «Нейтрино» необходимо всегда указывать виртуальную систему в файле сборки с помощью атрибута virtual= , который затем устанавливает флаг STARTUP_HDR_FLAGS1_VIRTUAL.

STARTUP_HDR_FLAGS1_BIGENDIAN
На процессоре используется обратный порядок следования байт. Процессоры должны всегда считывать этот флаг и проверять корректность используемого порядка следования байт.
STARTUP_HDR_FLAGS1_COMPRESS_NONE
Образ не сжат.
STARTUP_HDR_FLAGS1_COMPRESS_ZLIB
Образ сжат с помощью алгоритма libz ( gzip).
STARTUP_HDR_FLAGS1_COMPRESS_LZO
Образ сжат с помощью алгоритма liblzo.
STARTUP_HDR_FLAGS1_COMPRESS_UCL
Образ сжат с помощью алгоритма libucl. Этот формат используется, если в сценарии сборки утилиты mkifs указан атрибут [+compress].

Note: В настоящее время программы startup-* поддерживают только метод сжатия UCL. Изменяя определения макросов SUPPORT_CMP_* в файле startup/lib/uncompress.c, можно выбирать другие поддерживаемые методы сжатия.



Константы STARTUP_HDR_FLAGS1_COMPRESS_* на самом деле не являются флагами, поскольку могут устанавливать несколько битов и используются как перечисление типов сжатия.

Следует отметить, что флаги flags1 и flags2 являются однобайтовыми, а, следовательно, не зависят от используемого порядка следования байт.
flags2
На текущий момент поле не используется.
header_size
Размер заголовка модуля startup-*:

sizeof( struct startup_header )

machine
Тип компьютера из файла <sys/elf.h>.
startup_vaddr
Виртуальный адрес, по которому передается управление после завершения IPL.
paddr_bias
Значение, которое складывается с физическим адресом и присваивается виртуальному указателю.
image_paddr
Физический адрес образа. В зависимости от типа образ может находиться в ПЗУ или оперативной памяти; дополнительную информацию см. в разделе Связь между полями структуры startup_header далее в этой главе.
ram_paddr
Физический адрес в оперативной памяти, по которому копируется образ. Объем копируемых данных составляет startup_size байт.
ram_size
Количество байт, которые занимает образ, загруженный в оперативную память. Это значение используется модулем startup-*, который находится в образе, и в текущий момент не требуется IPL. Этот размер может быть больше значения stored_size, если образ был сжат, или меньше stored_size, если образ выполняется по месту хранения.
startup_size
Размер кода модуля startup-*. Это количество байт копируется из начала образа в оперативную память. Поскольку модуль startup-* никогда не сжимается, его размер всегда соответствует действительности.
stored_size
Размер образа с учетом заголовка. Поле stored_size также используется в процедурах копирования/распаковки образов, которые не выполняются по месту хранения.
imagefs_paddr
IPL записывает в это поле физический адрес файловой системы образа. Поле используется модулем startup-*.
imagefs_size
Размер файловой системы распакованного образа.
preboot_size
Содержит количество байт между началом загруженного образа и заголовком модуля startup-*. Как правило, это значение равно нулю, т.е. заголовок запуска располагается в начале образа. В системах x86 с BIOS это поле имеет ненулевое значение из-за небольшого фрагмента кода, который считывает данные из BIOS в реальном режиме, а затем переключается в защищенный режим и выполняет модуль startup-*.
zero
zero0
Заполнитель нулями (зарезервирован для применения в будущем).
info
Массив struct startup_info *. Это область для передачи данных от IPL к модулю startup-*. Когда IPL определяет различные характеристики системы (количество установленной памяти, текущее время, сведения о системной шине и др.), он сохраняет их в массиве info, чтобы модуль startup-* мог пользоваться ими в будущем. Это устраняет необходимость повторного определения характеристик системы в модуле startup-*.

Следует обратить внимание, что поле info объявлено как массив long для выделения пространства памяти. Фактически поле info содержит массив структур struct startup_info_hdr.

Классификация:

ЗОСРВ «Нейтрино», startup

Тематические ссылки:

struct startup_info_hdr

Построение встраиваемых систем




Предыдущий раздел: перейти