Описание конфигурации устройств
Иерархические идентификаторы
Для указания подустройства внутри комбинированных устройств используются иерархические идентификаторы, представляющие собой NULL-терминированный массив строк.
Пример:
A- устройство A -["A\0", NULL]A.B- устройство B, находящееся в устройстве A -["A\0", "B\0", NULL]A.B.C- устройство C, находящееся ... в устройстве A -["A\0", "B\0", "C\0", NULL]

Конфигурация комбинированного устройства
Представляет собой композицию одиночных устройств и параметры для их соединения между собой
compose_dev_conf_t:
| Имя поля | Тип поля | Комментарий |
|---|---|---|
baseConfigs | conf_dev_t[] | массив одиночных устройств |
clockConf | clock_conf_t | глобальная конфигурация тактирования, WIP |
projections | projection_conf_t[] | параметры проецирования памяти между устройствами |
intercepts | intercept_conf_t[] | параметры перехватов доступа к памяти устройств |
Конфигурация одиночного устройства
conf_dev_t:
| Имя поля | Тип поля | Комментарий |
|---|---|---|
libpath | str | путь к .so-библиотеке |
id | str[] | идентификатор состоящий из массива строк - иерархический |
clockId | str[] | идентификатор родительского источника тактирования - иерархический |
clockDivider | u64 | делитель относительно родительского источника тактирования |
clockMultipler | u64 | множитель родительского источника тактирования |
memConf | conf_mem_seg_t[] | конфигурация сегментов памяти |
Конфигурация сегмента памяти устройства
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[] | идентификатор устройства куда будет указывать проекция. Иерархический |
baseSeg | str | название сегмента памяти устройства куда будет указывать проекция |
targetAt | str[] | идентификатор устройства куда будет установлена проекция. Иерархический |
targetSeg | str | название сегмента, который будет заменен на спроецированный |
projectionShift | u64 | сдвиг относительно начала целевого сегмента |
Если IO_REGS устройства device_B проецируется на IO_REGS устройства device_A со сдвигом projectionShift, схема доступа к памяти выглядит таким образом:

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

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

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

intercept_conf_t:
| Имя поля | Тип поля | Комментарий |
|---|---|---|
op | char | тип перехватываемой операции |
kind | u8 | вариант действия на перехвате |
payload | void* | тело конфигурации - дублирование | подмена | обработчик |
Типы перехватываемых операций
op | Описание |
|---|---|
r | перехват чтения, не применяется при дублировании операций (вызовет ошибку) |
w | перехват записи |
b | перехват и чтения и записи (при дублировании операций эквивалентно w) |
Варианты действий на перехвате
| Вариант действий | Числовой код в конфигурации | Описание |
|---|---|---|
| shadow copy | 1 | дублирование операций записи |
| shadow replace | 2 | подмена ячейки |
| callback | 3 | запуск обработчика перехвата устройства |
Конфигурация дублирования операций
| Имя поля | Тип поля | Комментарий |
|---|---|---|
interceptId | str[] | идентификатор устройства откуда дублировать |
interceptSeg | str | имя сегмента, из которого дублировать запись |
interceptAddr | u64 | адрес из которого дублировать запись |
targetId | str[] | идентификатор устройства в которое копировать запись |
targetSeg | str | имя сегмента, в которое дублировать запись |
targetAddr | u64 | адрес куда дублировать запись |
Конфигурация подмены ячейки
| Имя поля | Тип поля | Комментарий |
|---|---|---|
interceptId | str[] | идентификатор устройства в котором будет замена |
interceptSeg | str | имя сегмента, в котором будет замена |
interceptAddr | u64 | адрес, который надо заменить |
targetId | str[] | идентификатор устройства в котором находится ячейка замены |
targetSeg | str | имя сегмента, в котором находится ячейка замены |
targetAddr | u64 | адрес ячейки, на которую будет выполнена замена |
Конфигурация перехвата через обработчик
| Имя поля | Тип поля | Комментарий |
|---|---|---|
interceptId | str[] | идентификатор устройства в котором будет перехват |
interceptSeg | str | имя сегмента, в котором будет перехват |
interceptAddr | u64 | адрес, который надо перехватить |
targetId | str[] | идентификатор устройства, которое предоставляет обработчик |
callbackName | str | название обработчика перехвата |