Вот "официальная" документация по формату KX (версия 0.0): В спецификации всё описано подробно и детально, а далее я опишу покороче и в общих чертах.
KolibriOS eXecutable File Format (KX) был разработан в качестве преемника формата M0x (MENUET0x). При этом преследовались две цели: компактность (заголовка и полей в нём) и расширяемость (от версии к версии). Все KX файлы состоят из двух либо трёх частей: заголовок, необязательный подзаголовок и код/данные. Заголовок должен присутствовать обязательно и выглядит таким образом:
Code: Select all
db "KX", maj_kx_ver shl 4 + min_kx_ver, kx_flags
Т.е. простейшая программа выглядит примерно так:
Code: Select all
use32
org 0
db "KX", 0, 0
include "macros.inc"
mcall -1
При использования подзаголовка, устанавливаются флаги в kx_flags (самый младший бит устанавливается в 1, биты 1-2 в 00/01/10 - для 8-/16-/32-битных чанков). Подзаголовок является линейным массивом из чанков (chunks) или фреймов и располагается сразу после заголовка. Каждый чанк состоит из заголовка (тип чанка + размер данных) и непосредственно данных. Завершает заголовок специальный чанк -1. Для версии 0.0 с помощью чанков можно определить точку входа, стартовый размер памяти процесса, размер стека, атрибуты исполняемого файла, краткое описание программы и множество чанков с таблицей импорта (один на одну библиотеку).
Файл с чанками загружаются похожим образом, но с небольшими отличиями. Если определена точка входа, EIP устанавливается на неё. Если был определён размер стэка, то выделяется не 4КБ, а указанное кол-во. Если был определён стартовый размер памяти, то выделяется память не по размеру образа программы, а указанное кол-во.
Все KX-процессы получают при запуске в EAX указатель на PRDB (Pre-Runtime Data Block). В нём загрузчик размещает следующие данные:
- PID процесса
- PID родителя (загрузчика)
- указатель на строку с именем KX-файла
- указатель на строку с переданными параметрами