Продвинутый

Simantic (YC F26): Firmware Simulation for AI Agents

Алексей Кузнецов
Алексей Кузнецов
Системный администратор31 октября 2026 г.13 мин чтения

Hi HN, we’re Ahnaf and Seungmin from Simantic. We built a firmware simulation layer that lets engineers and AI agents test firmware without hardware.

Simantic (YC F26): Firmware Simulation for AI Agents

Hi HN, we’re Ahnaf and Seungmin from Simantic. We built a firmware simulation layer that lets engineers and AI agents test firmware without hardware.

Simantic и его решение для симуляции прошивки

Почему традиционный тест прошивки не подходит

Тестирование прошивки на реальном железе требует физического доступа к устройству, что делает процесс дорогостоящим и медленным. На практике разработчик часто сталкивается с несколькими проблемами:

  • Ограниченная репродуктируемость. Один и тот же набор команд может вести себя по‑разному на разных платах из‑за несовместимости микроконтроллеров, версии прошивки bootloader'а или состояния батарейки RTC.
  • Зависимость от внешних компонентов. Для проверки работы UART, SPI, I²C или датчиков необходимы реальные периферийные устройства, которые трудно подключать в лабораторных условиях.
  • Время отклика. Перезапуск оборудования, загрузка прошивки и проверка результата могут занимать от нескольких минут до часов, особенно если требуется повторяемость в CI‑pipeline.

Пример типичной команды QEMU, используемой для ручного теста:

bash
qemu-system-x86_64 -machine accel=kvm -bios /opt/firmware/my_firmware.bin \
    -kernel /opt/kernel/linux.bin -append "root=/dev/sda console=ttyS0"

Эта команда эмулирует процессор, но всё равно требует, чтобы пользователь вручную проверял вывод через UART, что неудобно для автоматизации. Кроме того, QEMU не моделирует все специфические регистры микроконтроллера, поэтому некоторые ошибки прошивки могут остаться незамеченными.

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


Как работает слой симуляции Simantic

Simantic построен на базе QEMU, но добавляет «тонкий» уровень абстракции, который перехватывает вызовы hardware‑API и заменяет их программными моделями. Это позволяет:

  1. Симулировать любые микросхемы без необходимости менять физическое железо.
  2. Подменять периферийные устройства (UART, I²C, GPIO) на mock‑версии, фиксируя их состояние в логах.
  3. Интегрировать с AI‑агентами через простой API, чтобы агенты могли отправлять команды и получать ответы в реальном времени.

Пример конфигурационного файла

yaml
simulation:
  arch: x86_64
  firmware: /opt/firmware/my_firmware.bin
  kernel: /opt/kernel/linux.bin
  mock:
    uart: true
    rtc: true
    gpio:
      - pin: 17
        state: input
      - pin: 27
        state: output

Запуск симуляции

bash
simantic run --config sim.yaml

Команда запускает QEMU в режиме, указанном в sim.yaml, а слой симуляции подменяет обращения к реальному UART и RTC на программные эмуляторы. Все события (вход/выход, изменение состояния GPIO) фиксируются в журнале, который можно передать AI‑агенту для анализа.

Преимущества для AI‑агентов

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

Сравнение с другими подходами выглядит так: Docker‑Compose для микросервисов — это как IKEA для мебели, всё собирается, но свои нюансы; Simantic для прошивки — это как набор LEGO‑блоков, позволяющий собрать любую плату из виртуальных деталей без риска повредить реальное устройство.

Обзор Corgi: мультиплексор для терминала и AI‑агентов
Обзор Hob: локальный ИИ‑помощник для работы с файлами

Таким образом, слой симуляции Simantic решает главную проблему традиционного тестирования — отсутствие предсказуемости и скорости, открывая путь к более эффективной разработке AI‑агентов, работающих с прошивкой.

Техническая архитектура и ключевые технологии

Техническая архитектура и ключевые технологии

### Использование QEMU и Linux

QEMU — это открытый эмулятор hardware, который в Simantic используется как основу для имитации прошивки. Запуск происходит на Linux‑системах с поддержкой KVM, что позволяет выполнять эмуляцию с почти native‑speed.

Для простого теста загрузите образ диска и укажите firmware‑файл:

bash
# Создание пустого диска объёмом 10 ГБ
qemu-img create -f qcow2 firmware.qcow2 10G

# Запуск QEMU с KVM, 2 ГБ RAM, UEFI‑ BIOS и сетевой forward‑port 2222→22
qemu-system-x86_64 \
  -machine q35 \
  -cpu host \
  -m 2048 \
  -bios /usr/share/OVMF/OVMF_CODE.fd \
  -drive file=firmware.qcow2,format=qcow2,if=none,id=drive0 \
  -device virtio-blk-pci,drive=drive0 \
  -netdev user,id=net0,hostfwd=tcp::2222-:22 \
  -device virtio-net-pci,netdev=net0

В примере выше:

  • -machine q35 — модернизированный тип машины, поддерживает PCI‑эмуляцию.
  • -cpu host — использует процессорный набор хоста, что повышает производительность.
  • -bios — указывает путь к UEFI‑ BIOS, необходимый для загрузки прошивки с поддержкой Secure Boot.
  • -netdev user — создаёт простой пользовательский сетевой стек, позволяющий пробросить порт 2222 на хост‑порт 22 (например, для SSH‑доступа в эмулированную систему).

Для автоматизации можно оформить запуск в unit‑файле systemd:

ini
[Unit]
Description=Simantic QEMU firmware simulation
After=network.target

[Service]
ExecStart=/usr/bin/qemu-system-x86_64 \
  -machine q35 \
  -cpu host \
  -m 2048 \
  -bios /usr/share/OVMF/OVMF_CODE.fd \
  -drive file=/opt/simantic/firmware.qcow2,format=qcow2,if=none,id=drive0 \
  -device virtio-blk-pci,drive=drive0 \
  -netdev user,id=net0,hostfwd=tcp::2222-:22 \
  -device virtio-net-pci,netdev=net0
Restart=always
User=simantic
Group=simantic

[Install]
WantedBy=multi-user.target

После размещения файла simantic-qemu.service в /etc/systemd/system/ его можно активировать:

bash
systemctl daemon-reload
systemctl enable --now simantic-qemu.service

### Интеграция с AI‑агентами

AI‑агенты могут взаимодействовать с эмулятором через командный интерфейс или REST‑API. Один из вариантов — вызывать QEMU из скрипта на Python, передавать прошивку и собирать вывод, а затем передавать его в LLM для анализа.

Пример скрипта на Python:

python
import subprocess
import json

def run_qemu(firmware_path: str, timeout: int = 300) -> str:
    cmd = [
        "qemu-system-x86_64",
        "-machine", "q35",
        "-cpu", "host",
        "-m", "2048",
        "-bios", "/usr/share/OVMF/OVMF_CODE.fd",
        "-drive", f"file={firmware_path},format=qcow2,if=none,id=drive0",
        "-device", "virtio-blk-pci,drive=drive0",
        "-netdev", "user,id=net0,hostfwd=tcp::2222-:22",
        "-device", "virtio-net-pci,netdev=net0",
        "-serial", "stdio",
        "-no-reboot",
        "-snapshot"
    ]
    result = subprocess.run(
        cmd,
        capture_output=True,
        text=True,
        timeout=timeout,
    )
    return result.stdout

if __name__ == "__main__":
    out = run_qemu("/opt/simantic/firmware.bin")
    # Здесь можно передать `out` в LLM, например, через Hob
    print(out)

В этом коде:

  • subprocess.run — выполняет QEMU и перенаправляет вывод в stdout.
  • Параметр -serialstdio позволяет получать консольный вывод в поток Python.
  • timeout — защищает от зависания эмулятора.

Для упрощения взаимодействия с AI‑агентом удобно использовать Docker‑Compose, который поднимает сервис с QEMU и exposes API‑endpoint:

yaml
version: "3.9"
services:
  qemu-sim:
    image: simantic/qemu-sim:latest
    container_name: qemu-sim
    ports:
      - "2222:22"
    volumes:
      - /opt/simantic/firmware:/firmware/firmware.bin:ro
    command: ["-machine", "q35", "-cpu", "host", "-m", "2048", "-bios", "/usr/share/OVMF/OVMF_CODE.fd", "-drive", "file=/firmware/firmware.bin,format=qcow2,if=none,id=drive0", "-device", "virtio-blk-pci,drive=drive0", "-netdev", "user,id=net0,hostfwd=tcp::2222-:22", "-device", "virtio-net-pci,netdev=net0", "-serial", "stdio"]

AI‑агент, например, Hob, может вызывать этот сервис по HTTP, а затем интерпретировать полученный вывод. Для примера работы с Hob см. Обзор Hob: локальный ИИ‑помощник для ваших файлов и Обзор Hob: локальный ИИ‑ассистент для ваших файлов.

Кроме того, для мультиплексирования терминальных сессий и AI‑запросов удобно использовать Corgi, который предоставляет unified‑интерфейс. Подробнее в Обзоре Corgi: мультиплексор для терминала и AI‑агентов.

Заключение

Симуляция прошивки в Simantic построена на проверенном стеке QEMU + Linux, что обеспечивает высокую точность и предсказуемость. Интеграция с AI‑агентами реализуется через простой CLI‑интерфейс или HTTP‑API, позволяя автоматизировать тестирование и анализ без необходимости физического доступа к оборудованию. Такой подход гарантирует, что ваш код и прошивки работают стабильно в любой среде, от локального «домашнего сервера» до облачной инфраструктуры.

Практические сценарии применения

Практические сценарии применения

### Тестирование AI‑моделей в CI/CD

Тестировать модели в CI/CD удобно, когда образ прошивки доступен в эмуляторе QEMU.
Simantic provides a lightweight firmware‑simulation layer, которая запускается в контейнере и имитирует hardware‑интерфейсы, необходимые для инференса.

Почему это работает

  • Docker или Podman изолирует процесс, а QEMU эмулирует CPU и периферийные регистры.
  • В CI‑pipeline достаточно добавить шаг с запуском контейнера‑симулятора, а затем выполнить инференс через API модели.

Пример CI‑pipeline (GitHub Actions)

yaml
name: Firmware AI test

on:
  push:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu‑latest
    steps:
      - uses: actions/checkout@v3

      - name: Install QEMU
        run: sudo apt-get update && sudo apt-get install -y qemu-system-x86

      - name: Build Docker image with Simantic simulation
        run: |
          docker build -t simantic/firmware-sim .
      
      - name: Run firmware simulation
        run: |
          docker run --rm \
            --device /dev/kvm \
            -v ${{ github.workspace }}/firmware.bin:/firmware.bin \
            simantic/firmware-sim \
            qemu-system-x86_64 -machine q35 -cpu host -m 2G \
            -bios /firmware.bin -serial stdio -monitor stdio &
          SIM_PID=$!
          sleep 5   # give QEMU time to boot
      
      - name: Execute AI inference
        env:
          SIM_API_URL: http://localhost:8080/infer
        run: |
          curl -X POST $SIM_API_URL \
            -H "Content-Type: application/json" \
            -d '{"model": "resnet50", "input": "dummy data"}' \
            | jq .
      
      - name: Cleanup
        run: kill $SIM_PID

Что делает каждый шаг

  • Install QEMU – ставим эмулятор, необходимый для запуска бинарника прошивки.
  • Build Docker image – собираем образ, в котором уже есть Simantic‑layer и QEMU.
  • Run firmware simulation – стартуем контейнер, монтируем файл прошивки, включаем серийный консоль для отладки.
  • Execute AI inference – отправляем запрос модели через локальный API, который Simantic предоставляет в контейнере.

Практическая точка зрения
Если ваш CI‑pipeline уже использует Docker, достаточно добавить один сервис‑контейнер с QEMU + Simantic. Это не требует отдельного хоста‑эмулятора и сохраняет быстроту запуска.

Для локального контроля удобно воспользоваться Обзор Hob: локальный ИИ‑помощник для ваших файлов, который показывает, как интегрировать локальный AI‑ассистент в процесс сборки.

### Отладка прошивки без доступа к железу

Отладка прошивки без физического доступа к железу реализуется через QEMU + Simantic simulation.
Эмулятор предоставляет виртуальный UART‑порт, к которому можно подключиться через screen, minicom или gdb.

Базовый запуск QEMU

bash
qemu-system-x86_64 \
  -machine q35 \
  -cpu host \
  -m 2G \
  -bios /path/to/firmware.bin \
  -serial stdio \
  -monitor stdio
  • -machine q35 – современная модель chipset, поддерживает PCIe‑эмуляцию.
  • -cpu host – использует все возможности хост‑CPU, ускоряя работу.
  • -m 2G – выделяем 2 ГБ оперативной памяти для гостя.
  • -bios – указываем файл прошивки, который будет загружен в BIOS‑память.
  • -serial stdio – перенаправляем UART‑вывод в терминал, чтобы видеть boot‑лог.
  • -monitor stdio – открываем монитор, доступный через тот же поток ввода‑вывода.

Подключение gdb для отладки

bash
# В отдельном терминале
gdb-multiarch -ex "target remote localhost:1234" -ex "symbol-file /path/to/firmware.elf"
  • target remote localhost:1234 – подключаемся к QEMU, который запущен с параметром -gdb tcp::1234.
  • symbol-file – указываем ELF‑файл, чтобы иметь имена функций в отладчике.

Типичный workflow

  1. Собрать firmware в обычном кросс‑компиляторе (например, make ARCH=arm CROSS_COMPILE=arm-none-eabi-).
  2. Поместить бинарник в каталог, доступный QEMU (можно смонтировать через -virtfs).
  3. Запустить QEMU с -gdb tcp::1234 и -serial stdio.
  4. Подключиться gdb и выполнять break main, continue, stepi и т.д.

Плюсы такого подхода

  • Нет необходимости в физическом стенде – достаточно одного ноутбука.
  • Возможность автоматизировать проверку в CI, как описано в предыдущем подразделе.
  • Симуляция peripheral‑ов (UART, SPI, I²C) позволяет отладить взаимодействие без реального железа.

Практический пример
Если вам нужно проверить, что boot‑loader корректно инициализирует UART, можно добавить в конфиг QEMU:

bash
-serial mon:stdio -device isa-serial,chardev=uart0

После запуска в stdio появятся как консольный вывод, так и отладочный журнал, что упрощает поиск ошибок.

Итого
Тестирование AI‑моделей в CI/CD и отладка прошивки без доступа к железу используют одну и ту же основу – QEMU + Simantic‑simulation.
Оба сценария позволяют сохранять предсказуемость конфигураций, а также быстро проверять изменения в коде или в прошивке, не тратя время на подключение реального оборудования.

Для более детального ознакомства с возможностями локального AI‑ассистента в CI‑pipeline см. Обзор Corgi: мультиплексор для терминала и AI‑агентов.

Перспективы проекта и открытый код

Перспективы проекта и открытый код

Roadmap проекта

Во-первых, план развития Simantic делится на несколько этапов, каждый из которых расширяет возможности симуляции и упрощает интеграцию с AI‑агентами.

Сначала – базовая поддержка QEMU для самых распространённых архитектур (x86_64, aarch64). Планируется открытый Docker‑образ с предустановленным QEMU‑клиентом, чтобы инженеры могли запускать симуляцию одной командой:

bash
docker run --rm -v $(pwd)/firmware:/firmware simantic/qemu-sim:latest \
    qemu-system-x86_64 -machine q35 -cpu host -m 4G -bios /firmware/bios.bin \
    -kernel /firmware/kernel.bin -append "console=ttyS0" -nographic

Следующий этап – модульная архитектура. Симулятор будет поставляться как набор плагинов, позволяющих подключать разные типы прошивок (BIOS, UEFI, Barebox). Каждый плагин будет описан в YAML‑конфиге, пример которого ниже:

yaml
plugin: "uefi"
image: "simantic/uefi-sim:latest"
options:
  - "--machine"
  - "q35"
  - "-cpu"
  - "host"
  - "-m"
  - "4G"
  - "-bios"
  - "/firmware/uefi.bin"

Третий этап – интеграция с AI‑агентами. Планируется API‑endpoint, который принимает запрос в формате JSON и возвращает лог симуляции в реальном времени. Пример запроса:

json
{
  "agent_id": "winnie-pukh",
  "firmware_path": "/firmware/raspbian.img",
  "timeout_sec": 300,
  "output_format": "json"
}

Последний – открытая экосистема. Запуск общедоступного репозитория на GitHub, где каждый может добавлять новые плагины, тесты и CI‑конфигурации. Планируется система автоматической проверки совместимости с последними версиями QEMU и Linux‑ядра.

По ссылке на текущий статус можно посмотреть Roadmap в репозитории.

Как внести свой вклад

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

  1. Разработка плагинов

    • Клонируйте репозиторий: git clone https://github.com/simantic/firmware-sim.git.
    • Добавьте новый каталог с кодом плагина и опишите его в plugin.yaml.
    • Пример структуры:
    bash
    plugins/
      my-plug/
        __init__.py
        Dockerfile
        plugin.yaml
    
    • Запустите локальный тестовый контейнер: docker build -t simantic/my-plug . && docker run --rm simantic/my-plug.
  2. Улучшение документации

    • Откройте issue в репозитории с описанием недостающих инструкций.
    • Пример PR‑описания:
    ## Описание
    Добавлена страница «Запуск симуляции в Docker» с примерами для разных архитектур.
    ## Тесты
    Добавлен скрипт `test_docker.sh`, проверяющий запуск контейнера и вывод версии QEMU.
    
  3. Bug‑репорты и тест‑кейсы

    • При обнаружении ошибки запустите симуляцию с флагом -d для дебаг‑лога и приложите его к issue.
    • Пример команды:
    bash
    qemu-system-x86_64 -machine q35 -cpu host -m 2G -bios bios.bin -kernel kernel.bin -d exec -nographic
    
  4. CI/CD и тестирование

    • В репозитории уже есть workflow ci.yml, который проверяет сборку Docker‑образов и запуск тестовых сценариев.
    • Чтобы добавить свой тест, создайте файл в tests/ и укажите его в ci.yml.
  5. Код‑ревью

    • Перед отправкой pull‑request убедитесь, что код проходит lint‑проверку (flake8) и не содержит запрещённых терминов, таких как «размещение на домашних серверах».
    • Пример проверки:
    bash
    flake8 plugins/my-plug
    

Ссылка на примеры ввода‑вывода и типовых задач: Обзор Corgi: мультиплексор для терминала и AI‑агентов демонстрирует, как можно использовать симуляцию в сочетании с другими локальными инструментами.

Если вы хотите начать с малого, сначала улучшите README, добавив примеры запуска и описание структуры проекта. Это самый быстрый способ привлечь внимание сообщества и получить обратную связь.

Часто задаваемые вопросы

Как Simantic ускоряет CI‑pipeline тестирования прошивки?

Во-первых, Simantic перехватывает вызовы hardware‑API и заменяет их программными моделями, что позволяет запускать тесты в изолированном окружении без физического железа. С практической точки зрения время отклика падает от нескольких минут до нескольких секунд, а параллельные задачи могут выполняться одновременно на нескольких ядрах. Это делает процесс полностью воспроизводимым и совместимым с CI‑pipeline.

Можно ли симулировать работу периферийных интерфейсов (UART, SPI, I²C) в Simantic?

Да, Simantic включает в себя моделированные драйверы UART, SPI и I²C, которые имитируют регистры микроконтроллера и генерируют ответы на запросы. Это позволяет разработчику проверять работу протоколов и обработку данных без подключения реального оборудования. Для автоматизации можно задавать скрипты, которые отправляют команды и проверяют вывод через стандартные потоки.

Какие ограничения есть у симуляции микроконтроллеров в Simantic?

Ограничения заключаются, и отсутствует полная модель низкоуровневых регистров микроконтроллера, а также не воспроизводятся точные временные параметры тактирования. Это значит, что ошибки, связанные с таймингами или специфичными инструкциями, могут оставаться незамеченными. Тем не менее для большинства сценариев тестирования прошивки, включая работу с UART, SPI и I²C, симуляция считается достаточной.

Как интегрировать Simantic в существующий проект на Python или C?

Для интеграции Simantic в проект достаточно добавить Docker‑образ с предустановленным QEMU и слоем симуляции, после чего его можно вызывать через командную строку или библиотеку Python. В C‑проектах удобно использовать API, предоставляемый Simantic, который позволяет передавать бинарный образ и получать результат в виде stdout или файла. Пример команды выглядит так: docker run -v $(pwd)/firmware.bin:/firmware.bin simantic/simulate --input /firmware.bin --output result.txt.

Поддерживает ли Simantic работу с реальными образами прошивки (bin, hex) без конвертации?

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

Поделиться:TelegramX / TwitterVK

Читайте также