OSAKA NDS Embedded Linux Cross Online Forum #11～Hypervisorシステムのデバッグと可視化の検討～

2020.7.11
株式会社DTSインサイト
木村健太郎
Our insight, your value

1© 2020自己紹介
株式会社 DTSインサイト
木村 健太郎99年に合併前の横河ディジタルコンピュータに入社。
以来、adviceシリーズICEのデバッガ開発に従事。
デバッガmicroVIEW-PLUSの開発初期メンバーとして参画以来、組込みOS対応、マルチコア対応、SMP対応、などデバッグ環境の進化に応じた設計を担当してきました。
動的解析ツール、受託開発を経て、現在は古巣ICE開発
にて、新製品adviceXrossの開発、Hypervisor環境のデバッグや可視化の対応を推進中。
Our insight, your value

https://www.dts-insight.co.jp/corporate/recruit/2019/interview03.html

2© 2020

会社概要【会社概要】
商号

株式会社DTSインサイト（英文名：DTS INSIGHT CORPORATION）

設立

2001年6月

創立

1972年3月

資本金2億円

従業員数

372名（2020年4月1日現在）

役員

代表取締役社長 浅見 伊佐夫
代表取締役常務 鴨林 英雄
取締役
安藤 裕一
取締役
浦島 邦明
取締役
中村 裕
監査役
赤松 謙一郎拠点

東京（初台、高田馬場）、名古屋、大阪、福岡

関連会社

株式会社DTS他、DTSグループ各社

大阪オフィス（江坂）九州オフィス（博多）

高田馬場第一、二オフィス
中部支店（栄）本社（初台）【会社沿革】
1972年

株式会社データ通信システム設立、デジタルコンピュータ株式会社設立

1980年

アートシステム株式会社設立

1990年「デジタルコンピュータ株式会社」から「横河ディジタルコンピュータ株式会社」に社名変更

2003年「株式会社データ通信システム」から「株式会社DTS」に社名変更

2014年

横河ディジタルコンピュータ株式会社が株式会社DTSの子会社にアートシステム株式会社が株式会社DTSの子会社に

2015年

アートシステム株式会社が株式会社DTSの組込み関連事業の一部を承継

2017年

横河ディジタルコンピュータ株式会社とアートシステム株式会社の両社が合併し、株式会社DTSインサイトを設立

Our insight, your value

3© 2020事業内容
お客様
エンジニアリングサービス

組込み開発ツール販売

車載

Our insight, your value

医療社会インフラ

Factory Automation4© 2020

今日お伝えしたい事
Hypervisorを採用/提案するにはデバッグと検証環境に課題が・・・（お客様）• 仮想環境のデバッグ
HW上で直接実行する、Type1 Hypervisorのデバッグについて紹介
複数のゲストOSがスケジューリングされるHVシステムをどのようにデバッグするか？
・ Armv8-AのVirtualizationと合わせて簡単に解説
・ デバッグ事例の紹介
・ Xen on ArmⓇ にて、Xenのトラップコードを覗いてみる• 仮想環境の可視化
可視化の目的はなにか？自分の処理は遅くないよね・・・？
・ バックエンドの時間を知る方法は？
Our insight, your value

5© 2020仮想環境のデバッグ
6Hypervisorになってもやりたことって？
• OSを、ドライバを、アプリを、デバッグしたい！
– 今まで同様、シングルOSのデバッグで操作したことと同じことがしたい。
– 欲張りなケースとして、念のため複数のVMを同時にデバッグできるといい。
APP

APP

APP

Kernel

CoreCore

Core

APP

APP

APP

APP

driverdriverdriverKernelKerneldriver

vCPU

Core

vCPU

vCPU

ここ！

vCPU

Hypervisor
CoreCore

Core

Core

Our insight, your value

7© 2020解説！ AArch64 virtualization
contextの識別– AArch64特権モデル（pstate.EL）• EL2＝ Hypervisor

VMID:1– VMID（VTTBR_EL2.VMID)

EL0• 仮想マシンID＝Guest-OS

物理アドレス解決vIRQ– 2段階のメモリ変換• [VA] →[IPA] →[PA]HVが直接制御

EL1

APP

APP

VMID:2APP

APP

driverdriverKernelKernel

VA

IPA

IRQ

HV=物理リソースの割り当て、実行時間の制御– 例外とルーティング• EL2で受け付けてからの→仮想割込み

EL2
EL3

vCPU

vCPU

vCPU

vCPU

PA

Hypervisor
Secure monitor– vCPUのスケジューリング
Our insight, your value

8© 2020

Hypervisor環境のデバッグシステムとは？
カレントを識別して、VM毎にデバッグシステムを切り替えれば、いままでと同じデバッグができる
マルチOSデバッグ•••「VMコンテキスト」ごとのデバッグ操作を実現
カレントのVMコンテキストを自動検出「OS認識機能」と「OSシンボル」を自動切換え

VMIDフィルター機能•

Dom0
Backend Linux
VMID-1

DomU
Frontend Linux
VMID-2

Xen-Hypervisor

指定したVMコンテキストでブレーク（Watchpointブレーク）

各種ARMv8仮想対応• メモリの2段階アドレス変換

全部できます。

Our insight, your value

9© 2020実際にデバッグをしてみた！「Xen on Arm」
•特徴– オープンソース（だれでも手軽に利用可）– Type1 Hypervisor•

HWの仮想化サポートを可能な限り活用している– カーネルモードとハイパーバイザモードを切り替えるた
めに導入されたHVC命令– MMUは２段階のページ変換をサポート– 汎用タイマー、GIC割込みコントローラは仮想化に対応

出典：https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842530/XEN+Hypervisor
Our insight, your value

10© 2020実際にデバッグをしてみた！「Xen on Arm」
Xenの実行環境
ICE：adviceXross 新製品！
SoC：Xilinx社 Zynq UltraScale+ MPSoC（Cortex-A53x4）
Boards ：Xilinx社 ZCU102/ZCU106ボード
BSP：petalinux 2019.1
Debug Target：HV：Xen-Hypervisor （4.11.1）
Dom0 ：Backend Linux （4.19.0）
DomU ：Frontend Linux （4.19.0）↖これ新製品！

Our insight, your value

11© 2020参考：Xenの環境構築•

https://xilinxwiki.atlassian.net/wiki/spaces/A/pages/99188792/Building+Xen+Hypervisor+with+Petalinux+2019.1

BuildからSDブートまで手順をなぞるだけ！

Our insight, your value

12© 2020

Xen on Arm - Debugging
DomUからHypervisorへアクセスするルートをデバッグする••

Dom-UからXenのVersion問合せ～Xen-KernelとDom0とDomUの3つのOSを同時デバッグ– ゲストOSにコンソールからXenのVersionを問い合わせ• cat /sys/hypervisor/version/major– ドライバコール：EL0→EL1• SVC– システムコール：EL1→EL2EL0

EL1

Dom0
APP

APP

Dom-0
LinuxDomU
APP

APP

Dom1

• HVC– 命令トラップ

：EL2

EL2

Xen Hypervisor• VBAR_EL2 Vectorコード
Our insight, your value

13© 2020

Xen on Arm – Multi Guest Debug• VMIDを指定して、各Kernelシンボルを登録

VMID:1
APP

APP

Dom0
Kernel

VMID:2
APP

APP

DomU
KernelXen Hypervisor

Our insight, your value

14© 2020

Xen on Arm－System call
• VM：DomUのコンソールから、Versionをsysfs経由で問合せ
cat /sys/hypervisor/version/major
drivers/xen/

sys-hypervisor.c

EL0→EL1

SVC
Our insight, your value

15© 2020

Xen on Arm－System call
• VM：EL1→EL2へ制御を移すためhvc命令を実行
cat /sys/hypervisor/version/major
drivers/xen/

sys-hypervisor.carch/arm64/xen

hypercall.s
HVC

Our insight, your value

16© 2020

Xen on Arm – vector:entry.S• Xen：VECTORのアドレスはVBAR_EL2レジスタ
VBAR_EL2
arch/arm/arm64

entry.sEL2の同期例外に
OCDブレークで罠を貼る

Our insight, your value

17© 2020

Xen on Arm – Traps:EL2• Xen：VectorからXen-Hypervisorのトラップコード
VBAR_EL2
arch/arm/arm64

entry.s
arch/arm/traps.c

Our insight, your value

18© 2020

Xen on Arm – Traps:EL2• Xen：トラップコードから目的のVersion取得処理に到達！
VBAR_EL2
arch/arm/arm64

entry.s
arch/arm/traps.c
common/kernel.c

Our insight, your value

19© 2020仮想環境の可視化
20

仮想環境で何を可視化したいか？
目的はなにか？
•

例えば・・・パフォーマンス観点– 自分の処理は遅くないよね・・・？
– バックエンドが遅いんじゃないかな？

•もしくは・・・なぜ自分のOSに処理がまわってこないのか？
– 自分のOSは設計通りスケジューリングされているか？
– vCPUのスケジューリングに問題があるのでは？

大きく2つに分けて考える（とりあえず）•

前者は、GuestOS視点– 自分のアプリがダメなのか、バックエンドの時間なのか、切り分けをしたい。

•

後者は、 システム視点– vCPUのスケジューリングとその根拠、HVの仕事の分析をしたい。

Our insight, your value

21© 2020プログラムの実行時間を測定するには？
• VMのソースに埋め込む：今までと同じAPIライブラリ等によるhook関数の埋め込み– context switchをロギングする（__switch_to_）– 関数コールをロギングする– システムコールをロギングする

経過時間

バックエンド処理時間

ｖCPU0
vCPU1

Our insight, your value

backendThreadHV

HVThread

Func A
Func B22© 2020HVシステム全体を見れないか？
• 自分のVMだけでなく全体のロードバランスが知りたい
VM_EXITVM_ENTRY
IRQ（EL2）
・・・– HVのvCPUスケジューリングは？

• HVの実行時間が知りたい– HVの介入による時間はどの程度なのか？
しかし

HVに埋め込むことは出来ない・ OSSではない・ デバッグ用hookポイントがあるかも？

Core0
HVvCPUvCPU

Our insight, your value

23© 2020HVシステムの実行時間を測定するには？
• HVの外側から観測するには？
– CPUのイベントをデバッグIFを使用してロギングする– Arm® CoreSight™ ETM• Virtual context identifier tracing：仮想コンテキスト識別子トレース
経過時間
バックエンド処理時間

CPU0
CPU1

backendThread

EL0

HV

HV

Thread

EL0
EL1

EL1

EL1

EL2

EL2

Our insight, your value

24© 2020CoreSightでシステムトレースに有効なものは？
• Arm® CoreSight™ コンポーネント– ETM：Virtual context identifier tracing（EL2）– STM: ソフトウェアトレースをHWで収集
Zynq UltraScale+ MPSoC のデバッグシステム

https://japan.xilinx.com/support/documentation/user_guides/j_ug1085-zynq-ultrascale-trm.pdf[

出典：UG1085 （v1.4）

Our insight, your value

25© 2020CoreSight：STMを使うには・・・• Linux：STM（System Trace Module）– Linaroの記事にあります。
– Arm純正のリファレンスボードの例があります。

• 残念ながら、まだ簡単には使えないようです。
– XilinxのSoCに、STMは搭載されています。
– TRMにも仕様の記載があります。
– しかし、Device TreeにCoreSightの記載がありません・・・– ｍenuconfigで有効にするだけでは使えません。
このへんは、またの機会に
Our insight, your value

26© 2020OSSだから見える事：Xen on Arm
Domainの管理構造、vCPUの管理構造
Global symbol “domain_list”
Global symbol “vcpu”

struct vcpu **vcpu→ VM list→ vcpu list

max_vcpusはdomain毎の仮想CPUコア数

struct vcpu{
int
vcpu_id;
int
processor;
vcpu_info_t *vcpu_info;
struct domain *domain;
struct vcpu *next_in_list;～～
struct arch_vcpu arch;};

vcpu_id domain毎の仮想CPU ID
processor 物理CPU ID
struct vcpu{
int
vcpu_id;
int
processor;
vcpu_info_t *vcpu_info;
struct domain *domain;
struct vcpu *next_in_list;～略～
struct arch_vcpu arch;};

struct arch_vcpu{
struct {register_t x19;
register_t x20;
register_t x21;
register_t x22;
register_t x23;
register_t x24;
register_t x25;
register_t x26;
register_t x27;
register_t x28;
register_t fp;
register_t sp;
register_t pc;} saved_context;
void *stack;～～/* MMU */register_t vbar;
register_t ttbcr;
uint64_t ttbr0, ttbr1;～～
uint32_t contextidr;
register_t tpidr_el0;
register_t tpidr_el1;
register_t tpidrro_el0;～～} __cacheline_aligned;

Our insight, your value

27© 2020OSSだから見える事：Xen on Arm
vCPUのスケジューリング
arch/arm/domain.c：context_switch（ ）arch/arm/arm64/entry.S：__context_switch

ここにAPIライブラリを挿入してvcpuのスケジューリングを可視化
Our insight, your value

28© 2020まとめ• HVのデバッグ– ゲストOSの同時デバッグは、AArch64 Virtualizationの情報で実現できた！

• 可視化：VM– HVやvCPUの処理は見えないが、EL1の動作でバックエンドの時間を推測可能• 可視化：外から観測– CoreSight ETMを活用すれば、contextの実行履歴が取得できる。
• ただし、使うためのハードルが高い• 可視化：HVの中に期待– Hypervisorが直接トラップする例外やスケジューラは見えない。
– vCPUのスケジューリングなどは、HVのトレースポイントの公開を期待！！
Our insight, your value29© 2020

Xen on Arm

HVのデバッグ

HVの可視化Arm® CoreSight™ ETM/STM
Our insight, your valuemacroTRACE-VIEWER
30© 2020本日はご視聴頂きましてありがとうございました。
本日の内容でもっと知りたいと言う方はご連絡をください！
info-advice@dts-insight.co.jp

是非、最適な環境で開発を行っていきましょう！

Our insight, your value

Fin.
31

© 2020Our insight, your value© 2020Resource•

https://static.docs.arm.com/100942/0100/aarch64_virtualization_1
00942_0100_en.pdf
https://wiki.xenproject.org/wiki/Category:XenARM
https://xilinxwiki.atlassian.net/wiki/spaces/A/pages/18842530/XEN+Hypervisor
https://static.docs.arm.com/100942/0100/aarch64_virtualization_1
00942_0100_en.pdf
https://www.linaro.org/blog/stm-and-its-usage/••••

Our insight, your value© 2020