Библиотека elcore¶
Библиотека elcore для DSP предоставляет интерфейс для создания заданий, ожидания завершения экземпляра заданий, а также обработки системных вызовов DSP. Данная библиотека не реализует функционал для создания экземпляров заданий, а также настройки передачи аргументов для экземпляров заданий.
Библиотека elcore имеет следующие особенности:
Создание ELFParser¶
Класс ELFParser предназначен для разбора ELF-файла. Класс не имеет публичных полей и методов. Объект класса 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 GetKernelVirtualAddress(const char *kernel_name)¶
Возвращает виртуальный адрес кернела по его названию.
Создает экземпляр класса
ElcoreELF
. В качестве аргумента принимает указатель на объект классаELFParser
.
-
const uint32_t GetEntryPoint() const¶
Для создания объекта класса ELF необходимо вызвать метод CreateELF()
.
Создание заданий¶
Область памяти, размещаемая по фиксированному адресу в пространстве DSP.
Файловый дескриптор созданного mapper’а.
Размер mapper’а.
Адрес, по которому должна располагаться секция в адресном пространстве DSP.
-
class ElcoreJob¶
-
const size_t GetStackSize() const¶
Возвращает размер стека задания.
-
const int GetFD() const¶
Возвращает файловый дескриптор задания
Создает экземпляр класса
ElcoreJob
. Описание аргументов методаCreateElcoreJob()
:elf_parser — объект ELF-парсера, созданный с помощью
CreateELFParser()
;elf — объект ELF, созданный с помощью
CreateELF()
;elcore_fd — файловый дескриптор устройства, открытого с помощью open(2);
stack_size — размер стека задания в байтах.
Создает экземпляр класса
ElcoreJob
. Описание аргументов методаCreateElcoreJobWithSharedSections()
:elf_parser — объект ELF-парсера, созданный с помощью
CreateELFParser()
;elf — объект ELF, созданный с помощью
CreateELF()
;elcore_fd — файловый дескриптор устройства, открытого с помощью open(2);
stack_size — размер стека задания в байтах.
sections — вектор элементов типа
ElcoreSharedSection
.
Метод позволяет на этапе создания задания отмапировать в адресное пространство DSP область памяти по фиксированным адресам по аналогии с ELF-секциями. Это позволяет в некоторых случаях снизить накладные расходы на создание экземпляров заданий.
-
const size_t GetStackSize() 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
.