10.2.3 Файловый формат bFLT

Предыдущая  Содержание  Следующая V*D*V

Форматом исполняемого файла для стандартного Linux является ELF. uClinux вводит новый формат файлов, разработанный для  решения следующих  задач:

 

Упрощение процесса загрузки и выполнения приложения.

Создание небольшого и эффективно использующего память формата файла (заголовки ELF являются большими).

Создание файлового формата, который поможет решить проблемы при загрузке программ в системах без MMU.

Обеспечение хранения таблицы переадресации для FRB или глобальной таблицы смещений в случае исполняемых файлов PIC.

 

Форматом файла, используемым в uClinux, является двоичный FLAT (bFLT). Компиляторы и компоновщики uClinux имеют специальные флаги, которые помогают генерировать bFLT файл на основе FRB или PIC. Ядро uClinux также имеет новый загрузчик, который может интерпретировать заголовки bFLT. Ниже приведена структура 64-х байтного заголовка bFLT, находящаяся по адресу со смещением 0 любом файле bFLT.

 

struct flat_hdr {

  char magic[4];

  unsigned long rev;        /* Версия */

  unsigned long entry;      /* Смещение первой исполняемой

                               инструкции с текстовым сегментом

                               от начала файла */

  unsigned long data_start; /* Смещение сегмента данных

                               от начала файла */

  unsigned long data_end;   /* Смещение конца сегмента

                               данных от начала файла */

  unsigned long bss_end;    /* Смещение конца сегмента bss

                               от начала файла */

 

  /*

   * Предполагается, что участок между data_end и bss_end

   * формирует сегмент bss.

   */

 

  unsigned long stack_size;  /* Размер стека в байтах */

  unsigned long reloc_start; /* Смещение записей переадресации

                                от начала файла */

  unsigned long reloc_count; /* Количество записей переадресации */

  unsigned long flags;

  unsigned long filler[6];   /* Зарезервировано, устанавливается в 0 */

};

 

Строка magic в любом файле bFLT представляет из себя 4-х байтовую последовательность ASCII символов 'b', 'f', 'l', 't' или 0x62, 0x46, 0x4C, 0x54. rev указывает номер версии файла. entry указывает на начальное смещение текстового сегмента от начала файла. Обычно это 0x40 (64), размер данного заголовка. Сразу же после текста расположен сегмент данных, а размер сегмента данных хранится в data_start и data_end. Сегмент bss начинается с data_end и заканчивается в bss_end. Заголовок bFLT хранит размер стека, выделенного для приложения, в stack_size. (* Размер стека может быть установлен в момент преобразования файла ELF в FLT.) Позже мы покажем, почему необходимо указать размер стека.

Поля reloc_start и reloc_count предоставляют информацию о начальном смещении и количестве записей переадресации. Напомним, что каждая запись переадресации является указателем на абсолютный адрес, который должен быть модифицирован. Новый адрес для записи рассчитывается путём сложения базового адреса соответствующего сегмента с абсолютным адресом, указанным в записи.

Загрузчик файлов bFLT в ядре реализован в файле linux/fs/binfmt_flat.c. Основной функцией является load_flat_binary. Эта функция отвечает за загрузку и выполнение файла bFLT в системе uClinux. Функция читает заголовок и выделяет необходимую память. На основании записей в поле flags объём памяти, выделяемый для бинарного файла PIC, будет размером со стек и данные (в том числе GOT). Если это бинарный файл не PIC формата, то это размер стека, данных (в том числе таблицы переадресации) и текста. Он также связывает необходимые текстовые сегменты и помечает страницы как исполняемые. Данный формат файлов также позволяет иметь сжатый gzip текстовый раздел, о чём указывается в поле flags. В этом случае загрузчик также заботится о распаковке текстовых разделов в оперативную память. После того, как все разделы связаны между собой, мы готовы к модификации адресов. Рисунок 10.2 показывает разделы файла bFLT, а Рисунок 10.3 показывает единый файл при загрузке в память. Отметим, что стек, попадающий в bss, приведёт к падению системы, поскольку обработчика ошибок нет.

 

Рисунок 10.2 Разделы файла bFLT.

Рисунок 10.2 Разделы файла bFLT.

 

Рисунок 10.3 Файл bFLT, загруженный в память.

Рисунок 10.3 Файл bFLT, загруженный в память.

 

Предыдущая  Содержание  Следующая