Загрузочный заголовок IPL
#include <sys/startup.h>
struct startup_header {
unsigned int signature;
unsigned short version;
unsigned char flags1;
unsigned char flags2;
unsigned short header_size;
unsigned short machine;
unsigned int startup_vaddr;
unsigned int paddr_bias;
unsigned int image_paddr;
unsigned int ram_paddr;
unsigned int ram_size;
unsigned int startup_size;
unsigned int stored_size;
unsigned int imagefs_paddr;
unsigned int imagefs_size;
unsigned short preboot_size;
unsigned short zero0;
unsigned int zero[3];
unsigned int info[48];
};
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
- Если этот флаг установлен, операционная система выполняется с включенным блоком управления памятью.
 | В текущей версии ЗОСРВ «Нейтрино» необходимо всегда указывать виртуальную систему в файле сборки с помощью атрибута 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].
 | В настоящее время программы 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
Построение встраиваемых систем
Предыдущий раздел: перейти