Upgrade to Pro — share decks privately, control downloads, hide ads and more …

QEMU/arm64+Xen で domU Zephyr をマルチ起動

Avatar for K. Hayashi K. Hayashi
October 11, 2025

QEMU/arm64+Xen で domU Zephyr をマルチ起動

Zephyr project meetup: Osaka Japan

Avatar for K. Hayashi

K. Hayashi

October 11, 2025

More Decks by K. Hayashi

Other Decks in Programming

Transcript

  1. 1 QEMU/arm64+Xen で domU Zephyr をマルチ起動 Embedded SW Engineer/OpenSource Contributer

    K.Hayashi ( khayash1) 2025/10/20 Zephyr Project Meetup: Osaka Japan
  2. 2 About me 2025/10/20 Name: K.Hayashi ( khayash1) Job: Embedded

    SW Engineer OpenSource Contributer  Linux kernel (For soc, dts, pci, net, usb, sdhci, ata, spi, …)  U-Boot  Buildroot  OP-TEE  Zephyr RTOS [new!]
  3. 3 QEMU/arm64 & Zephyr 2025/10/20 • QEMU 上で Zephyr を立ち上げる

    https://docs.zephyrproject.org/latest/boards/qemu/cortex_a53/doc/ • QEMU + KVM 上で Zephyr を立ち上げる https://docs.zephyrproject.org/latest/boards/qemu/kvm_arm64/doc/ • QEMU 上で Xen + dom0 Zephyr を立ち上げる https://docs.zephyrproject.org/latest/snippets/xen_dom0/README.html  QEMU/arm64 上で Zephyr を動かす取り組み【既存】 QEMU/arm64 Zephyr QEMU/arm64 Zephyr Host PC Host PC (arm64) QEMU/arm64 Host PC OS OS (Linux; kvm) OS Xen dom0 Zephyr 何がうれしい? ⇒ とりあえず QEMU なら実機なくてもすぐ試せる ⇒ コケても再起動が簡単 domU domU
  4. 4 Topics 2025/10/20  QEMU/arm64 上で Xen + dom0 Linux

    を起動し、 domU Zephyr を複数立ち上げる取組み Xen QEMU/arm64 dom0 domU domU Zephyr Zephyr domU Zephyr Linux 何がうれしい? ⇒ 複数の CPU で個別に Zephyr を動かす環境を再現できる ⇒ コケても再起動がさらに簡単 Host PC OS Dom0: domU を制御する特権OS DomU: 仮想化されたドメイン
  5. 5 Overview 2025/10/20  動作環境を作成 • Buildroot で QEMU+Xen+Linux 環境構築

    • west で Zephyr をビルド • 起動に必要なファイルを FAT filesystem に準備  QEMU を起動 • UEFI BIOS を実行 ⇒ UEFI shell に到達 • Xen 起動 ⇒ dom0 Linux 起動 ⇒ Linux shell に到達  domU Zephyr を起動 • Zephyr app/shell に到達 • Zephyr を複数起動  (時間があれば) 動作デモ
  6. 6 Buildroot (menu) 2025/10/20 • ビルド PC 環境は Ubuntu 24.04

    LTS • いろいろ簡略化のため buildroot を使用 (latest: 2025.08) • QEMU/arm64 向け設定 • Xen, Xen-tools を追加 git clone https://github.com/buildroot/buildroot.git –b 2025.08 --depth 1 cd buildroot make qemu_aarch64_virt_defconfig Filesystem images ---> [*] cpio the root filesystem (for use as an initial RAM filesystem) Compression method ---> (X) gzip Target packages ---> System tools ---> [*] xen [*] Xen hypervisor [*] Xen tools Zephyr に関わる落とし穴あり
  7. 7 Buildroot (notice) 2025/10/20 • Buildroot latest: 2025.08 に含まれる Xen

    は 古いまま止まっている • Buildroot Xen は 4.14.6 、Xen 最新は 4.20.1 • Zephyr が使っている GICv3 レジスタ (GICD_ICPENDR, GICR_ICPENDR0) がエミュレートされない ⇒ 割込みが動作せず停止 ⇒ Xen に patch を当ててエミュレート関数を追加する必要あり
  8. 8 Buildroot (kernel) 2025/10/20 File systems ---> DOS/FAT/EXFAT/NT Filesystems --->

    <*> VFAT (Windows-95) fs support Native language support ---> <*> Codepage 437 (United States, Canada) <*> NLS ISO 8859-1 (Latin 1; Western European Languages) make linux-menuconfig Kernel Features ---> [*] Xen guest support on ARM64 • Xen を有効化 • ( 設定などを置く) FAT filesystem を有効化
  9. 9 Buildroot (build) 2025/10/20 $ ls -1 output/images Image rootfs.cpio

    rootfs.cpio.gz rootfs.ext2 rootfs.ext4 start-qemu.sh xen $ ./start-qemu.sh Booting Linux on physical CPU 0x0000000000 [0x410fd034] Linux version 6.12.47 (hayashi@ubuntu) ... random: crng init done Machine model: linux,dummy-virt efi: UEFI not found. ... make start-qemu.sh を起動してビルドできていることを確認しておく
  10. 10 FAT filesystem 2025/10/20 xen-boot/ xen.efi Xen バイナリイメージ (from buildroot)

    xen.cfg Xen 設定ファイル virt-gicv3.dtb Xen devicetree Image dom0 Linux kernel バイナリイメージ (from buildroot) rootfs.cpio.gz dom0 Linux rootfs バイナリイメージ (from buildroot) zephyr.bin Zephyr kernel image (1) domU-zephyr.cfg domU config for zephyr (1) zephyr2.bin Zephyr kernel image (2) domU-zephyr2.cfg domU config for zephyr (2) 【1 】 【2 】 【3 】 【3 】  起動に必要なファイルを準備 • Host PC のディレクトリ (ここでは“xen-boot”) に置いたファイルを QEMU にて FAT としてアクセス
  11. 11 【1 】xen.cfg 2025/10/20 [global] default=linux [linux] kernel=Image dtb=virt-gicv3.dtb vcpus=4

     Xen dom0 用設定ファイルを作成 • kernel イメージファイルと devicetree ファイルを指定
  12. 12 【2 】Devicetree (virt-gicv3.dtb) 2025/10/20 $ export PATH=$PATH:$PWD/output/host/bin $ qemu-system-aarch64

    \ -M virt,gic-version=3,virtualization=true,dumpdtb=virt-gicv3.dtb -nographic \ -cpu cortex-a57 -smp 8 -m 4G $ dtc –O dts virt-gicv3.dtb > virt-gicv3.dts chosen { ... + #address-cells = <2>; + #size-cells = <2>; + module@0 { + compatible = "xen,multiboot-module"; + reg = <0 0x47000000 0 0x03000000>; + bootargs = "console=hvc0 root=/dev/vdb rw init=/sbin/init"; + }; }; $ dtc –O dtb virt-gicv3.dts | sed ‘s/\0arm,primecell//g’ > virt-gicv3.dtb  Xen 用 QEMU devicetree を作成 • QEMU から devicetree を取り出す • “arm,primecell” を削除して devicetree 再作成 • Xen dom0 (Linux) の情報を追加
  13. 13 【3 】domU-zephyr.cfg 2025/10/20 name="domU-zephyr" type="pvh" memory=16 vcpus=1 kernel="/boot/zephyr.bin" gic_version="v3"

    on_crash="preserve" extra="console=hvc0" name="domU-zephyr2" type="pvh" memory=16 vcpus=1 kernel="/boot/zephyr2.bin" gic_version="v3" on_crash="preserve" extra="console=hvc0" domU-zephyr.cfg: domU-zephyr2.cfg:  Xen domU の config ファイルを作成 • 同じ “name” の domU は起動できないので2つ作る • 動作を区別するため zephyr のバイナリも変えておく
  14. 14 Zephyr: Prepare 2025/10/20 chosen { zephyr,sram = &ram; zephyr,console

    = &xen_hvc; + zephyr,shell-uart = &xen_hvc; }; boards/xen/xenvm/xenvm_xenvm_gicv3_defconfig: boards/xen/xenvm/xenvm.dts: CONFIG_LOG=y CONFIG_LOG_MODE_MINIMAL=n CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME=y + +CONFIG_SHELL=y  Zephyr shell の有効化
  15. 15 Zephyr: Build 2025/10/20 source .venv/bin/activate west build –p always

    –b xenvm//gicv3 zephyr/samples/hello_world cp build/zephyr/zephyr.bin xen-boot/zephyr.bin west build –p always –b xenvm//gicv3 zephyr/samples/synchronization cp build/zephyr/zephyr.bin xen-boot/zephyr2.bin  Zephyr を build (w/west) • domU でのボード指定は “xenvm//gicv3” としておく • サンプルバイナリを2 つビルド • 1 つ目は hello_world • 2 つ目は synchronization
  16. 16 QEMU 起動 2025/10/20 export PATH=$PATH:$PWD/buildroot/output/host/bin qemu-system-aarch64 \ -M virt,gic-version=3,virtualization=true

    -nographic \ -cpu cortex-a57 -smp 4 -m 4G \ -bios buildroot/output/host/usr/share/qemu/edk2-aarch64-code.fd \ -net none \ \ -drive file=fat:rw:xen-boot,format=raw \ -drive file=buildroot/output/images/rootfs.ext4,if=virtio,format=raw UEFI Interactive Shell v2.2 EDK II UEFI v2.70 (EDK II, 0x00010000) Mapping table ...... Press ESC in 1 seconds to skip startup.nsh or any other key to continue. Shell> xen • UEFI BIOS から Xen を起動 • UEFI BIOS を先に起動 buildroot から持ってくる buildroot から持ってくる
  17. 17 Xen ~dom0 Linux 2025/10/20 Xen 4.14.6 (c/s ) EFI

    loader Using configuration file 'xen.cfg' virt-gicv3.dtb: 0x0000000138231000-0x0000000138232fa4 Image: 0x0000000135693000-0x000000013822ca00 Xen 4.14.6 (XEN) Xen version 4.14.6 (hayashi@linux) (aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52)) 14.2.1 20241119) debug=n Thu Oct 2 20:03:41 JST 2025 ... (XEN) *** Serial input to DOM0 (type 'CTRL-a' three times to switch input) (XEN) Freed 332kB init memory. [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070] [ 0.000000] Linux version 6.12.0 (hayashi@linux) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #4 SMP PREEMPT Wed Sep 24 13:43:16 JST 2025 [ 0.000000] Machine model: linux,dummy-virt [ 0.000000] Xen 4.14 support found ... Welcome to Buildroot Buildroot login: root # mount /dev/vda1 /boot # ls /boot Image rootfs.cpio.gz xen.efi domU-zephyr.cfg virt-gicv3.dtb zephyr.bin domU-zephyr2.cfg xen.cfg zephyr2.bin • Xen が起動 • dom0 Linux が起動, FAT filesystem を /boot にマウント
  18. 18 domU Zephyr(1) 2025/10/20 # xl create -c /boot/domU-zephyr.cfg Parsing

    config from /boot/domU-zephyr.cfg Hello World! xenvm/xenvm/gicv3 [00:00:00.000,000] <inf> xen_events: xen_events_init: events inited [00:00:00.000,000] <inf> uart_hvc_xen: Xen HVC inited successfully *** Booting Zephyr OS build v4.2.1-16-ga0ae60640381 *** uart:~$ kernel thread list Scheduler: 320707 since last call Threads: *0x40034380 shell_uart options: 0x0, priority: 14 timeout: 0 state: queued, entry: 0x40006ff4 stack size 3072, unused 1008, usage 2064 / 3072 (67 %) 0x40035180 sysworkq options: 0x1, priority: -1 timeout: 0 state: pending, entry: 0x40010244 stack size 4096, unused 3712, usage 384 / 4096 (9 %) 0x40034000 logging options: 0x0, priority: 14 timeout: 0 state: pending, entry: 0x400037a0 stack size 4096, unused 3648, usage 448 / 4096 (10 %) 0x40034700 idle options: 0x1, priority: 15 timeout: 0 state: , entry: 0x4000d9b8 stack size 4096, unused 3792, usage 304 / 4096 (7 %) • domU Zephyr を起動 Ctrl + “]” で dom0 に戻る domU-1 を起動
  19. 19 domU Zephyr(2) 2025/10/20 # xl create -c /boot/domU-zephyr2.cfg Parsing

    config from /boot/domU-zephyr2.cfg [00:00:00.000,000] <inf> xen_events: xen_events_init: events inited [00:00:00.000,000] <inf> uart_hvc_xen: Xen HVC inited successfully *** Booting Zephyr OS build v4.2.1-16-ga0ae60640381 *** thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! # xl console domU-zephyr uart:~$ # xl console domU-zephyr2 thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! thread_a: Hello World from cpu 0 on xenvm! thread_b: Hello World from cpu 0 on xenvm! # xl list Name ID Mem VCPUs State Time(s) Domain-0 0 512 4 r----- 11.4 domU-zephyr 1 16 1 -b---- 0.0 domU-zephyr2 2 16 1 -b---- 1.3 • domU Zephyr2 を起動、1 と2 を切替 domU-1 に切替 domU-2 に切替 動作中のdom を確認 domU-2 を起動
  20. 20 動作確認デモ 2025/10/20 当初 WSL2 上で動かそうとしたところ,Xen のメモリフォールト問題が発生 QEMU ⇒ や

    Xen の問題ではなく,Host 側 OS の要因と思われる PC Ubuntu 24.04 (QEMU8.2.2) NG PC Ubuntu 24.04 QEMU10.1.50 NG WSL2 Ubuntu 24.04 (QEMU8.2.2) NG WSL2 Ubuntu 24.04 QEMU10.1.50 NG PC Ubuntu 22.04 (QEMU6.2.0) OK PC Ubuntu 22.04 QEMU10.1.50 OK WSL2 Ubuntu 22.04 (QEMU6.2.0) OK やむを得ず Ubuntu 22.04 に Fallback してデモへ…
  21. 21 Summary 2025/10/20  できたこと • QEMU/arm64 上で Xen +

    dom0 Linux を起動し、domU Zephyr を複数起動  つまづきポイント Zephyr • Zephyr についてはビルド環境が整っていれば特に課題はなし Buildroot/Xen • Buildroot の Xen が古くて GICv3 のエミュレーションが足りず backport QEMU • オプションが複雑 Host OS • Ubuntu 22 と 24 の間に QEMU+Xen に起因する問題あり