Библиотека elcore
Библиотека elcore для DSP предоставляет интерфейс для создания заданий, ожидания завершения экземпляра заданий, а также обработки системных вызовов DSP. Данная библиотека не реализует функционал для создания экземпляров заданий, а также настройки передачи аргументов для экземпляров заданий.
Библиотека elcore имеет следующие особенности:
Создание ELFParser
Класс ELFParser предназначен для разбора ELF-файла.
Примечание
Во время разбора ELF-файла проверяется, что стек (метка ___stack
) находится после
кучи (метка __end
).
Класс не имеет публичных полей и методов. Объект класса ELFParser используется при создании объектов класса ElcoreELF и ElcoreJob.
-
class ElcoreParser
-
std::shared_ptr<ELFParser> CreateELFParser(const unsigned char *binary, size_t binary_size)
Описание аргументов функции CreateELFParser()
:
binary - указатель на буфер с данными ELF-файла;
binary_size - размер буфера.
Для создания объекта класса ELFParser используется функция CreateELFParser()
.
Создание ELF
Класс ElcoreELF является обёрткой над ELF-файлом и имеет следующие публичные методы:
-
typedef std::map<std::string, uint32_t> KernelMap
-
class ElcoreELF
-
const uint32_t GetEntryPoint() const
Возвращает виртуальный адрес точки входа.
-
const uint32_t GetBinarySize() const
Возвращает размер ELF-файла.
-
const uint8_t *GetBinaryData() const
Возвращает байтовый массив данных ELF-файла.
-
const KernelMap GetKernels() const
Возвращает список доступных кернелов в виде ассоциативного массива.
-
const uint32_t GetStackPointer()
Возвращает виртуальный адрес дна стека из ELF-файла.
-
const uint32_t GetKernelVirtualAddress(const char *kernel_name)
Возвращает виртуальный адрес кернела по его названию.
Создает экземпляр класса
ElcoreELF
. В качестве аргумента принимает указатель на объект классаELFParser
.
-
const uint32_t GetEntryPoint() const
Для создания объекта класса ELF необходимо вызвать метод CreateELF()
.
Создание заданий
Область памяти, размещаемая по фиксированному адресу в пространстве DSP.
Файловый дескриптор созданного mapper’а.
Размер mapper’а.
Адрес, по которому должна располагаться секция в адресном пространстве DSP.
-
class ElcoreJob
-
const int GetFD() const
Возвращает файловый дескриптор задания
Создает экземпляр класса
ElcoreJob
. Описание аргументов методаCreateElcoreJob()
:elf_parser — объект ELF-парсера, созданный с помощью
CreateELFParser()
;elf — объект ELF, созданный с помощью
CreateELF()
;elcore_fd — файловый дескриптор устройства, открытого с помощью open(2).
Создает экземпляр класса
ElcoreJob
. Описание аргументов методаCreateElcoreJobWithSharedSections()
:elf_parser — объект ELF-парсера, созданный с помощью
CreateELFParser()
;elf — объект ELF, созданный с помощью
CreateELF()
;elcore_fd — файловый дескриптор устройства, открытого с помощью open(2);
sections — вектор элементов типа
ElcoreSharedSection
.
Метод позволяет на этапе создания задания отмапировать в адресное пространство DSP область памяти по фиксированным адресам по аналогии с ELF-секциями. Это позволяет в некоторых случаях снизить накладные расходы на создание экземпляров заданий.
-
const int GetFD() const
Для создания нового задания необходимо вызвать метод CreateElcoreJob()
или
CreateElcoreJobWithSharedSections()
. В случае успеха метод возвращает указатель
на объект класса ElcoreJob
.
Ожидание завершения экземпляра задания
-
int ElcoreJobInstancePoll(int job_instance_fd, int elcore_fd);
Описание аргументов функции ElcoreJobInstancePoll()
:
job_instance_fd — файловый дескриптор созданного экземпляра задания;
elcore_fd — файловый дескриптор открытого устройства /dev/elcoreX;
Функция ElcoreJobInstancePoll()
обрабатывает события, приходящие от драйвера
elcore50. Функция обрабатывает системные вызовы в случае прихода соответствующего события
(см. Обработка системных вызовов DSP). В случае успешного завершения экземпляра задания функция
ElcoreJobInstancePoll()
возвращает 0, в противном случае — 1.
Обработка системных вызовов DSP
Библиотека elcore выполняет обработку системных вызовов DSP по сигналу из драйвера elcore50. Ниже представлена диаграмма последовательности, согласно которой осуществляется обработка системных вызовов.
Форматирование вывода DSP
Библиотека elcore позволяет при каждом вызове write(2) со стороны DSP перед началом выводимой
строки дополнительно печатать текущее время и номер ядра, на котором был вызван данный
системный вызов. Управление данными опциями осуществляется с помощью переменных окружений
ELCORE_WRITE_TIMESTAMP
и ELCORE_WRITE_CORENUM
соответственно, которые необходимо
устанавливать перед запуском приложения, связанного с библиотекой elcore.
Допустимые значения переменной окружения ELCORE_WRITE_TIMESTAMP
:
0
— вывод времени не включен;1
— вывод времени включен.
Случай, когда переменная окружения ELCORE_WRITE_TIMESTAMP
не определена, аналогичен случаю,
когда переменная окружения равна 0
.
Допустимые значения переменной окружения ELCORE_WRITE_CORENUM
:
0
— вывод номера ядра не включен;1
— вывод ядра включен.
Случай, когда переменная окружения ELCORE_WRITE_CORENUM
не определена, аналогичен случаю,
когда переменная окружения равна 0
.
Использование данных опций может быть полезно при запуске программ на нескольких DSP, активно использующих write(2).
Управление страницами DSP
Библиотека elcore позволяет управлять размером страниц DSP. Управление осуществляется переменной
окружения ELCORE_HUGEPAGE_ENABLE
, которую необходимо устанавливать перед запуском приложения,
связанного с библиотекой elcore. Допустимые значения переменной окружения
ELCORE_HUGEPAGE_ENABLE
:
0
— используются только страницы размером 4К;1
— используются страницы размером 4К и 2М. Для того, чтобы драйвер гарантированно использовал 2М страницы необходимо, чтобы память была физически выровнена на 2М и состояла из фрагментированных частей, размер которых кратен 2М. Для ELF-секций управление выравниваний осуществляется переменной окруженийELCORE_HUGEPAGE_SECTIONS
, см. Управление выравниванием ELF-секций. Для остальных буферов пользователь должен сам обеспечивать физическое выравнивание, например, используяposix_memalign(3)
.
Случай, когда переменная окружения ELCORE_HUGEPAGE_ENABLE
не определена, аналогичен случаю,
когда переменная окружения равна 1
.
Управление выравниванием ELF-секций
Библиотека elcore позволяет управлять выравниванием ELF-секций DSP. Управление осуществляется
переменной окружения ELCORE_HUGEPAGE_SECTIONS
, которую необходимо устанавливать перед запуском
приложения, связанного с библиотекой elcore. Допустимые значения переменной окружения
ELCORE_HUGEPAGE_SECTIONS
:
0
— выравнивание осуществляется по размеру CPU-страницы, возвращаемойgetpagesize(2)
;1
— выравнивание осуществляется по размеру большой CPU-страницы, получаемой из файла/proc/meminfo
.
Случай, когда переменная окружения ELCORE_HUGEPAGE_SECTIONS
не определена, аналогичен случаю,
когда переменная окружения равна 1
.