Перейти к основному содержимому

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

Иерархические идентификаторы

Для указания подустройства внутри комбинированных устройств используются иерархические идентификаторы, представляющие собой 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]

dia

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

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

Имя поляТип поляКомментарий
baseConfigsconf_dev_t[]массив одиночных устройств
clockConfclock_conf_tглобальная конфигурация тактирования, WIP
projectionsprojection_conf_t[]параметры проецирования памяти между устройствами
interceptsintercept_conf_t[]параметры перехватов доступа к памяти устройств

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

conf_dev_t:

Имя поляТип поляКомментарий
libpathstrпуть к .so-библиотеке
idstr[]идентификатор состоящий из массива строк - иерархический
clockIdstr[]идентификатор родительского источника тактирования - иерархический
clockDivideru64делитель относительно родительского источника тактирования
clockMultipleru64множитель родительского источника тактирования
memConfconf_mem_seg_t[]конфигурация сегментов памяти

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

conf_mem_seg_t:

Имя поляТип поляКомментарий
namestrимя сегмента
startu64сдвиг начала сегмента в общем блоке памяти
lenu64длина сегмента
wordLenu8длина слова, байт

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

clock_conf_t:

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

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

projection_conf_t:

Имя поляТип поляКомментарий
baseAtstr[]идентификатор устройства куда будет указывать проекция. Иерархический
baseSegstrназвание сегмента памяти устройства куда будет указывать проекция
targetAtstr[]идентификатор устройства куда будет установлена проекция. Иерархический
targetSegstrназвание сегмента, который будет заменен на спроецированный
projectionShiftu64сдвиг относительно начала целевого сегмента

Если IO_REGS устройства device_B проецируется на IO_REGS устройства device_A со сдвигом projectionShift, схема доступа к памяти выглядит таким образом:
Диаграмма

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

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

Подмена ячейки

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

Дублирование операций

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

Запуск обработчика

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

intercept_conf_t:

Имя поляТип поляКомментарий
opcharтип перехватываемой операции
kindu8вариант действия на перехвате
payloadvoid*тело конфигурации - дублирование | подмена | обработчик
Типы перехватываемых операций
opОписание
rперехват чтения, не применяется при дублировании операций (вызовет ошибку)
wперехват записи
bперехват и чтения и записи (при дублировании операций эквивалентно w)
Варианты действий на перехвате
Вариант действийЧисловой код в конфигурацииОписание
shadow copy1дублирование операций записи
shadow replace2подмена ячейки
callback3запуск обработчика перехвата устройства

Конфигурация дублирования операций

Имя поляТип поляКомментарий
interceptIdstr[]идентификатор устройства откуда дублировать
interceptSegstrимя сегмента, из которого дублировать запись
interceptAddru64адрес из которого дублировать запись
targetIdstr[]идентификатор устройства в которое копировать запись
targetSegstrимя сегмента, в которое дублировать запись
targetAddru64адрес куда дублировать запись

Конфигурация подмены ячейки

Имя поляТип поляКомментарий
interceptIdstr[]идентификатор устройства в котором будет замена
interceptSegstrимя сегмента, в котором будет замена
interceptAddru64адрес, который надо заменить
targetIdstr[]идентификатор устройства в котором находится ячейка замены
targetSegstrимя сегмента, в котором находится ячейка замены
targetAddru64адрес ячейки, на которую будет выполнена замена

Конфигурация перехвата через обработчик

Имя поляТип поляКомментарий
interceptIdstr[]идентификатор устройства в котором будет перехват
interceptSegstrимя сегмента, в котором будет перехват
interceptAddru64адрес, который надо перехватить
targetIdstr[]идентификатор устройства, которое предоставляет обработчик
callbackNamestrназвание обработчика перехвата