Clone
4
Config
nikto_b edited this page 2025-01-22 00:09:33 +03:00

Описание конфигурации устройств

Конфигурация комбинированного устройства:

Представляет собой композицию одиночных устройств и параметры для их соединения между собой
compose_dev_conf_t:

Имя поля Тип поля Комментарий
baseConfigs conf_dev_t[] массив одиночных устройств, оканчивается на NULL
clockConf clock_conf_t глобальная конфигурация тактирования, WIP
projections projection_conf_t[] параметры проецирования памяти между устройствами, оканчивается на NULL
intercepts intercept_conf_t[] параметры перехватов доступа к памяти устройств, оканчивается на NULL

Конфигурация одиночного устройства:

conf_dev_t:

Имя поля Тип поля Комментарий
libpath str путь к .so-библиотеке
id str[] идентификатор состоящий из массива строк - иерархический, оканчивается на NULL
clockId str[] идентификатор родительского источника тактирования - иерархический, оканчивается на NULL
clockDivider u64 делитель относительно родительского источника тактирования
clockMultipler u64 множитель родительского источника тактирования
memConf conf_mem_seg_t[] конфигурация сегментов памяти, оканчивается на NULL

Конфигурация сегмента памяти устройства:

conf_mem_seg_t:

Имя поля Тип поля Комментарий
name str имя сегмента
start u64 сдвиг начала сегмента в общем блоке памяти
len u64 длина сегмента
wordLen u8 длина слова, байт

Конфигурация тактирования:

clock_conf_t:

Имя поля Тип поля Комментарий
limiter u64 пока не используется, WIP
WIP WIP WIP
WIP WIP WIP

Конфигурация проецирования сегментов памяти:

projection_conf_t:

Имя поля Тип поля Комментарий
baseAt str[] идентификатор устройства куда будет указывать проекция. Иерархический, оканчивается на NULL
baseSeg str название сегмента памяти устройства куда будет указывать проекция
targetAt str[] идентификатор устройства куда будет установлена проекция. Иерархический, оканчивается на NULL
targetSeg str название сегмента, который будет заменен на спроецированный
projectionShift u64 сдвиг относительно начала целевого сегмента

Конфигурация перехватов доступа к памяти:

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

Подмена адреса ячейки (shadow replace)

Подмена адреса ячейки выглядит таким образом:
Диаграмма
При этом, можно ограничить замену на исключительно чтение/запись, либо установить и на чтение и на запись.

Дублирование операций (shadow copy)

Дублировать можно только операции записи, поскольку нет никакой возможности прозрачно внедрить чтение из двух источников так, чтобы оно выглядело как чтение из однонго источника.
Диаграмма

Запустить обработчик (intercept callback)

При перехвате записи, обработчик ничего не возвращает, при этом может выполнить запись по любому адресу, который он выберет.
При перехвате чтения, обработчик должен вернуть значение, полученное при данном чтении. При этом он всё также может иметь полный доступ к устройству (и, например, снять флаг непрочитанного буфера).
Пример обработчика

intercept_conf_t: