Описание конфигурации устройств
Конфигурация комбинированного устройства:
Представляет собой композицию одиночных устройств и параметры для их соединения между собой
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: