B-System OS | Розділ 9: Віртуалізація VirtIO 1.4 & Synrc VE
← Головний зміст B-System

Специфікація VirtIO & Synrc VE

Модернізована Віртуалізація VirtIO 1.4

Взаємодія з пристроями реалізована за стандартом VirtIO 1.4 із підтримкою апаратної ізоляції пам'яті DMB (Device Memory Buffer) та мікроядра seL4. Застарілий legacy-код вилучено. Нижче наведено опис підсистем C-бібліотеки synrc/vio із типами та функціями C99.

1. Матриця Хостів Synrc VE

Віртуальне середовище B-System спирається на хостову платформу Synrc VE (VirtIO-MMIO / VirtIO-PCI):


2. Кільцеві Буфери Virtqueue (vio_queue.h)

Обмін даними виконується через кільцеві буфери Virtqueue (Split Virtqueue): Таблицю Дескрипторів (desc), Кільце Доступних Буферів (avail) та Використаних Буферів (used).

C99 Структури Черги Virtqueue:

/* Дескриптор буфера в пам'яті (VirtIO v1.4) */
struct vio_vring_desc {
    uint64_t addr;   /* Фізична адреса в RAM */
    uint32_t len;    /* Довжина у байтах */
    uint16_t flags;  /* Прапорці (VIO_VRING_DESC_F_NEXT, F_WRITE, F_INDIRECT) */
    uint16_t next;   /* Індекс наступного дескриптора */
};

/* Заголовок кільця доступних дескрипторів */
struct vio_vring_avail {
    uint16_t flags;
    uint16_t idx;
    uint16_t ring[];
};

/* Елемент кільця використаних буферів */
struct vio_vring_used_elem {
    uint32_t id;     /* Індекс обробленого дескриптора */
    uint32_t len;    /* Записано байтів */
};

/* Заголовок кільця використаних дескрипторів */
struct vio_vring_used {
    uint16_t flags;
    uint16_t idx;
    struct vio_vring_used_elem ring[];
};

/* Контекст черги у runtime */
struct vio_virtqueue {
    uint16_t queue_size;
    uint16_t last_avail_idx;
    uint16_t last_used_idx;
    struct vio_vring_desc *desc;
    struct vio_vring_avail *avail;
    struct vio_vring_used *used;
};

C99 Функції Управління Чергами:

/* Ініціалізація черги зі спільної пам'яті */
vio_status_t vio_queue_init(struct vio_virtqueue *vq, void *mem, uint16_t size);

/* Перевірка наявності оброблених елементів */
int vio_queue_has_used(const struct vio_virtqueue *vq);

3. Транспорт MMIO/PCI (vio_transport.h)

Шар транспорту абстрагує читання/запис регістрів VirtIO MMIO та PCI BAR для RISC-V 64, ARM64 та x86_64.

C99 Структури Транспорту та Платформи:

/* Основний екземпляр VirtIO-пристрою */
struct vio_device {
    const struct vio_transport_ops *ops;
    void *transport_ctx;
    uint32_t device_id;
    uint32_t vendor_id;
    uint64_t device_features;
    uint64_t driver_features;
};

/* Таблиця методів транспорту */
struct vio_transport_ops {
    uint32_t (*read32)(struct vio_device *dev, uint32_t offset);
    void (*write32)(struct vio_device *dev, uint32_t offset, uint32_t val);
    uint8_t (*read8)(struct vio_device *dev, uint32_t offset);
    void (*write8)(struct vio_device *dev, uint32_t offset, uint8_t val);
    vio_status_t (*negotiate_features)(struct vio_device *dev, uint64_t driver_features);
    vio_status_t (*setup_queue)(struct vio_device *dev, uint16_t queue_index, void *mem);
    void (*notify_queue)(struct vio_device *dev, uint16_t queue_index);
};

/* Абстракція хостової платформи */
struct vio_platform_ops {
    void *(*map_memory)(uint64_t phys_addr, uint32_t len);
    void (*unmap_memory)(void *virt_addr, uint32_t len);
    vio_status_t (*register_irq)(uint32_t irq, void (*handler)(void *ctx), void *ctx);
    void (*mask_irq)(uint32_t irq);
    void (*unmask_irq)(uint32_t irq);
};

C99 Функції Платформи:

/* Реєстрація хостової платформи */
void vio_platform_register(const struct vio_platform_ops *ops);

4. Графіка VirtIO-GPU & SDL2 (vio_gpu.h)

Підсистема virtio-gpu виконує вивід 2D-графіки, векторного wireframe-рендерингу (TRON / NetWars) та обробку Waterfall спектрограм у хостовому вікні SDL2 зі швидкістю 60-120 FPS.

C99 Структури VirtIO-GPU та SDL2 Blitter:

/* Заголовок командного пакета GPU */
struct virtio_gpu_ctrl_hdr {
    uint32_t type;
    uint32_t flags;
    uint64_t fence_id;
    uint32_t ctx_id;
    uint32_t padding;
};

/* Прямокутник геометрії */
struct virtio_gpu_rect {
    uint32_t x;
    uint32_t y;
    uint32_t width;
    uint32_t height;
};

/* Пакет створення 2D ресурсу */
struct virtio_gpu_resource_create_2d {
    struct virtio_gpu_ctrl_hdr hdr;
    uint32_t resource_id;
    uint32_t format;
    uint32_t width;
    uint32_t height;
};

/* Пакет передачі даних на хост */
struct virtio_gpu_transfer_to_host_2d {
    struct virtio_gpu_ctrl_hdr hdr;
    struct virtio_gpu_rect r;
    uint64_t offset;
    uint32_t resource_id;
    uint32_t padding;
};

/* Пакет оновлення екрану */
struct virtio_gpu_resource_flush {
    struct virtio_gpu_ctrl_hdr hdr;
    struct virtio_gpu_rect r;
    uint32_t resource_id;
    uint32_t padding;
};

/* Пакет прив'язки Scanout */
struct virtio_gpu_set_scanout {
    struct virtio_gpu_ctrl_hdr hdr;
    struct virtio_gpu_rect r;
    uint32_t scanout_id;
    uint32_t resource_id;
};

/* Контекст блітера хостового SDL2 */
struct vio_gpu_sdl2_blitter {
    uint32_t host_window_width;
    uint32_t host_window_height;
    uint32_t active_resource_id;
    uint32_t format;
    void *framebuffer;
    size_t framebuffer_size;
    bool dirty;
};

/* Пристрій VirtIO-GPU */
struct vio_gpu_device {
    struct vio_device *base;
    struct vio_gpu_sdl2_blitter blitter;
    uint32_t active_scanout;
    uint32_t current_resource_id;
};

C99 Функції VirtIO-GPU та SDL2 Blitter:

/* Ініціалізація GPU та SDL2 блітера */
vio_status_t vio_gpu_init(struct vio_gpu_device **out_dev, struct vio_device *base_dev);

/* Створення 2D ресурсу */
vio_status_t vio_gpu_create_resource_2d(struct vio_gpu_device *dev, uint32_t resource_id, uint32_t format, uint32_t width, uint32_t height);

/* Передача прямокутника фреймбуфера на хост */
vio_status_t vio_gpu_transfer_to_host_2d(struct vio_gpu_device *dev, uint32_t resource_id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint64_t offset);

/* Синхронізація (Flush) екрану */
vio_status_t vio_gpu_resource_flush(struct vio_gpu_device *dev, uint32_t resource_id, uint32_t x, uint32_t y, uint32_t width, uint32_t height);

/* Прив'язка scanout виходу */
vio_status_t vio_gpu_set_scanout(struct vio_gpu_device *dev, uint32_t scanout_id, uint32_t resource_id, uint32_t width, uint32_t height);

/* Прямий біт-блітінг у фреймбуфер SDL2 */
vio_status_t vio_gpu_sdl2_blit_frame(struct vio_gpu_device *dev, const void *src_buf, size_t buf_size);

5. Дискові Накопичувачі (vio_blk.h)

Асинхронний доступ до секторів 512Б / 4096Б для об'єктної файлової системи BTRON FS (Real & Virtual Objects).

C99 Функції Блочного Накопичувача:

/* Ініціалізація блочного диска */
vio_status_t vio_blk_init(struct vio_blk_device **out_dev, struct vio_device *base_dev);

/* Читання секторів у буфер */
vio_status_t vio_blk_read(struct vio_blk_device *dev, uint64_t sector, void *buf, uint32_t count);

/* Асинхронний запис секторів */
vio_status_t vio_blk_write(struct vio_blk_device *dev, uint64_t sector, const void *buf, uint32_t count);

6. Мережевий Адаптер (vio_net.h)

Транзит IP-пакетів та інкапсульованих радіокадрів (AX.25, LoRa, Ethernet-over-VirtIO) через RX/TX Virtqueue.

C99 Функції Мережевого Адаптера:

/* Ініціалізація мережевого пристрою */
vio_status_t vio_net_init(struct vio_net_device **out_dev, struct vio_device *base_dev);

/* Передача пакета у TX чергу */
vio_status_t vio_net_tx(struct vio_net_device *dev, const void *pkt, uint32_t len);

/* Отримання пакета з RX черги */
vio_status_t vio_net_rx(struct vio_net_device *dev, void *buf, uint32_t *len);

7. Консоль та SDR-Телеметрія (vio_console.h)

Багатоканальний потік: Порт 0 (системні логи ядра µITRON), Порт 1 (SDR IQ-телеметрія радіоприймачів).

C99 Функції Консолі:

/* Ініціалізація консолі */
vio_status_t vio_console_init(struct vio_console_device **out_dev, struct vio_device *base_dev);

/* Запис логів або IQ-потоку */
vio_status_t vio_console_write(struct vio_console_device *dev, const char *buf, uint32_t len);

/* Читання символьного потоку */
vio_status_t vio_console_read(struct vio_console_device *dev, char *buf, uint32_t max_len, uint32_t *out_len);

8. Апаратна Криптографія (vio_crypto.h)

Шифрування радіотелеметрії та перевірка підписів у TPM / Hardware Enclave / seL4 TSS.

C99 Функції Криптоприскорювача:

/* Ініціалізація криптографічного модулю */
vio_status_t vio_crypto_init(struct vio_crypto_device **out_dev, struct vio_device *base_dev);

/* Апаратне шифрування */
vio_status_t vio_crypto_encrypt(struct vio_crypto_device *dev, const void *in, void *out, uint32_t len);

/* Апаратне розшифрування */
vio_status_t vio_crypto_decrypt(struct vio_crypto_device *dev, const void *in, void *out, uint32_t len);

9. Автовизначення Шини (vio_bus.h)

Сканування пристроїв на шині VirtIO MMIO/PCI та автопошук за індексами пристрою.

C99 Функції Шини:

/* Сканування пристроїв на шині */
vio_status_t vio_bus_probe(void);

/* Пошук пристрою за device_id */
struct vio_device *vio_bus_find_device(uint32_t device_id);

10. Безпека VirtIO 1.4

Перехід на стандарт VirtIO 1.4 принципово підвищує рівень безпеки B-System у ключових компонентах: