synrc/vio із типами та функціями C99.
Віртуальне середовище B-System спирається на хостову платформу Synrc VE (VirtIO-MMIO / VirtIO-PCI):
Hypervisor.framework + libkrun + Host SDL2 / Metal Window.bhyve з прямим проходженням (Passthrough) VirtIO-пристроїв.
Обмін даними виконується через кільцеві буфери Virtqueue (Split Virtqueue): Таблицю Дескрипторів (desc), Кільце Доступних Буферів (avail) та Використаних Буферів (used).
/* Дескриптор буфера в пам'яті (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;
};
/* Ініціалізація черги зі спільної пам'яті */
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);
Шар транспорту абстрагує читання/запис регістрів VirtIO MMIO та PCI BAR для RISC-V 64, ARM64 та x86_64.
/* Основний екземпляр 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);
};
/* Реєстрація хостової платформи */
void vio_platform_register(const struct vio_platform_ops *ops);
Підсистема virtio-gpu виконує вивід 2D-графіки, векторного wireframe-рендерингу (TRON / NetWars) та обробку Waterfall спектрограм у хостовому вікні SDL2 зі швидкістю 60-120 FPS.
/* Заголовок командного пакета 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;
};
/* Ініціалізація 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);
Асинхронний доступ до секторів 512Б / 4096Б для об'єктної файлової системи BTRON FS (Real & Virtual Objects).
/* Ініціалізація блочного диска */
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);
Транзит IP-пакетів та інкапсульованих радіокадрів (AX.25, LoRa, Ethernet-over-VirtIO) через RX/TX Virtqueue.
/* Ініціалізація мережевого пристрою */
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);
Багатоканальний потік: Порт 0 (системні логи ядра µITRON), Порт 1 (SDR IQ-телеметрія радіоприймачів).
/* Ініціалізація консолі */
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);
Шифрування радіотелеметрії та перевірка підписів у TPM / Hardware Enclave / seL4 TSS.
/* Ініціалізація криптографічного модулю */
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);
Сканування пристроїв на шині VirtIO MMIO/PCI та автопошук за індексами пристрою.
/* Сканування пристроїв на шині */
vio_status_t vio_bus_probe(void);
/* Пошук пристрою за device_id */
struct vio_device *vio_bus_find_device(uint32_t device_id);
Перехід на стандарт VirtIO 1.4 принципово підвищує рівень безпеки B-System у ключових компонентах:
virtio-net 1.4 унеможливлює супутникові replay-атаки та спуфінг фазових IQ-потоків у SDR-каналах.VIRTIO_GPU_F_BLOB_ALIGNMENT гарантує ізоляцію текстур відеокарт від кабінетного сховища VOBJ.