SlideShare a Scribd company logo
1 of 10
Download to read offline
Rust で Hypervisor.framework を
触ってみた
〜 DOS を動かしてみた 〜
2020/1/27 Rust LT #8
@moriai19
自己紹介
• 盛合 敏(Satoshi Moriai / Shiisaa Moriai)
• https://github.com/moriai
• https://twitter.com/moriai19
• 昔は OS(Mach / Real-Time Mach, Linux)や
分散システムの開発をしていた
• 今は …
• 趣味で Rust や Swift と戯れる
やってみたいこと
• Rust や最新技術で分散型 OS の開発が少しは楽になるかも
• Mach を C で開発するのは大変だった
• インターフェースが矛盾したコードでもビルドでき、
デバッグに無駄な労力を費やした
• フルビルドは時間かかりすぎ、インクリメンタルビルドは
不完全
• macOS が好きなので、もっと弄んでみたい
ということで、
Rust で macOS の Hypervisor framework を
触ってみることにした
macOS Hypervisor framework とは
Virtual Memory
Threads
Mach
AppleHV.kext
hv_task_trap() hv_thread_trap()
VMX Driver
Hypervisor
Virtualized XXX
(仮想マシン、仮想OSなど)
ユーザプロセス
(ユーザタスク) Rust
crate xhypervisor
crate hypervisor もあるが
メンテされてない模様
Apple から提供される
API は C, Swift
macOS kernel
(Darwin)
・・・
BSD
• 仮想化のための軽量なハイパバイザフレームワーク
• Intel VMX をユーザプロセスから簡単に利用できる
• カーネルエクステンション AppleHV への橋渡しをする
Hypervisor.framework
ハイパバイザをプログラムしてみる
fn main() -> Result<(),Error> {
create_vm()?;
let mut mem = vec![0u8; MEMSIZE];
map_mem(&mem, 0, &perm)?;
let handle = thread::spawn(|| { // VCPUが複数なら、その数のスレッドを起動
let vcpu = vCPU::new()?;
VCPUの設定; メモリ上にプログラムやデータを配置; レジスタの設定;
loop {
vcpu.run(); // VMENTER → VCPUの実行 → VMEXIT
match vcpu.read_vmcs(VMCS_RO_EXIT_REASON)? {
vmx_exit::VMX_REASON_EXC_NMI => 例外やNMIの処理,
vmx_exit::VMX_REASON_HLT => break,
...
}
}
vcpu.destroy()?;
});
handle.join()?;
unmap_mem(0, MEMSIZE)?;
destroy_vm()?;
}
DOSを動かしてみる
• C++ DOS エミュレータ(https://github.com/mist64/hvdos.git)を利用
• ハイパバイザと同じ空間で動作
• DOSシステムコール(INT xxH, AH=yy)相当を Unix システムコールで実装
• DOS 2.x システムコール 87 個のうち 29 個を実装(オリジナルに3個追加)
• ハイパバイザ(Rust)
• VCPU を 16bit リアルモード用に設定し、DOS プログラムをメモリに貼り付け、IP
と SP を設定して、vcpu.run()
• INT が発生 → VMEXIT → 割り込み番号を取り出し、ラッパー経由でDOS エミュレー
タを呼び出す
DOSプログラムが動きました
• ネット上で見つけたバイナリが動きました
• HELLO.COM
• MORE.COM
• COMP.COM
• PKUNZJR.COM
• ソースコードは github で公開
• https://github.com/moriai/hvdos.rs.git
• 次回は 64bit OS & 完全 Rust 化にトライ?
おわりに

More Related Content

Similar to RustでHypervisor.frameworkを触ってみた 〜DOSを動かしてみた〜

XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08孝文 田村
 
Osc2008 Opensuse Moonlinx
Osc2008 Opensuse MoonlinxOsc2008 Opensuse Moonlinx
Osc2008 Opensuse MoonlinxKazuhisa Hara
 
Macで快適にプログラミング
Macで快適にプログラミングMacで快適にプログラミング
Macで快適にプログラミングYusuke Sakurai
 
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in expressサブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in expressTakahiro YAMAGUCHI
 
Makeblockでキミだけの最強ロボットをつくろう!
Makeblockでキミだけの最強ロボットをつくろう!Makeblockでキミだけの最強ロボットをつくろう!
Makeblockでキミだけの最強ロボットをつくろう!nmrmsys
 
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編Yoshito Tabuchi
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望Tetsuo Yamabe
 
Status Board 面白いよ!
Status Board 面白いよ!Status Board 面白いよ!
Status Board 面白いよ!Hishikawa Takuro
 
Parse.comからの脱出
Parse.comからの脱出Parse.comからの脱出
Parse.comからの脱出Muta Yutaro
 
ロボットシステム学2015年第5回
ロボットシステム学2015年第5回ロボットシステム学2015年第5回
ロボットシステム学2015年第5回Ryuichi Ueda
 
Using LXC on Production
Using LXC on ProductionUsing LXC on Production
Using LXC on ProductionIsao Shimizu
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳Uchio Kondo
 
Making Editor written in Ruby version 20160611
Making Editor written in Ruby version 20160611Making Editor written in Ruby version 20160611
Making Editor written in Ruby version 20160611Langur
 
WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」
WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」
WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」Tetsuo Kawakami
 
コンテナ技術と普及がシステム・インテグレータに与える影響
コンテナ技術と普及がシステム・インテグレータに与える影響コンテナ技術と普及がシステム・インテグレータに与える影響
コンテナ技術と普及がシステム・インテグレータに与える影響Masahito Zembutsu
 
murakumo クラウドコントローラ
murakumo クラウドコントローラmurakumo クラウドコントローラ
murakumo クラウドコントローラShingo Kawano
 

Similar to RustでHypervisor.frameworkを触ってみた 〜DOSを動かしてみた〜 (20)

XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08
 
Osc2008 Opensuse Moonlinx
Osc2008 Opensuse MoonlinxOsc2008 Opensuse Moonlinx
Osc2008 Opensuse Moonlinx
 
Macで快適にプログラミング
Macで快適にプログラミングMacで快適にプログラミング
Macで快適にプログラミング
 
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in expressサブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
サブドメイン前提のチーム機能開発で踏んだ
OAuthの罠の話 in express
 
Makeblockでキミだけの最強ロボットをつくろう!
Makeblockでキミだけの最強ロボットをつくろう!Makeblockでキミだけの最強ロボットをつくろう!
Makeblockでキミだけの最強ロボットをつくろう!
 
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
 
Status Board 面白いよ!
Status Board 面白いよ!Status Board 面白いよ!
Status Board 面白いよ!
 
Mrubyの始め方
Mrubyの始め方Mrubyの始め方
Mrubyの始め方
 
Parse.comからの脱出
Parse.comからの脱出Parse.comからの脱出
Parse.comからの脱出
 
Dockerプレゼン
DockerプレゼンDockerプレゼン
Dockerプレゼン
 
ロボットシステム学2015年第5回
ロボットシステム学2015年第5回ロボットシステム学2015年第5回
ロボットシステム学2015年第5回
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
Using LXC on Production
Using LXC on ProductionUsing LXC on Production
Using LXC on Production
 
190731 chalice
190731 chalice190731 chalice
190731 chalice
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
Making Editor written in Ruby version 20160611
Making Editor written in Ruby version 20160611Making Editor written in Ruby version 20160611
Making Editor written in Ruby version 20160611
 
WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」
WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」
WordBench Kagawa番外編「いちばんやわらかいconcrete5のはなし」
 
コンテナ技術と普及がシステム・インテグレータに与える影響
コンテナ技術と普及がシステム・インテグレータに与える影響コンテナ技術と普及がシステム・インテグレータに与える影響
コンテナ技術と普及がシステム・インテグレータに与える影響
 
murakumo クラウドコントローラ
murakumo クラウドコントローラmurakumo クラウドコントローラ
murakumo クラウドコントローラ
 

RustでHypervisor.frameworkを触ってみた 〜DOSを動かしてみた〜

  • 1. Rust で Hypervisor.framework を 触ってみた 〜 DOS を動かしてみた 〜 2020/1/27 Rust LT #8 @moriai19
  • 2. 自己紹介 • 盛合 敏(Satoshi Moriai / Shiisaa Moriai) • https://github.com/moriai • https://twitter.com/moriai19 • 昔は OS(Mach / Real-Time Mach, Linux)や 分散システムの開発をしていた • 今は … • 趣味で Rust や Swift と戯れる
  • 3. やってみたいこと • Rust や最新技術で分散型 OS の開発が少しは楽になるかも • Mach を C で開発するのは大変だった • インターフェースが矛盾したコードでもビルドでき、 デバッグに無駄な労力を費やした • フルビルドは時間かかりすぎ、インクリメンタルビルドは 不完全 • macOS が好きなので、もっと弄んでみたい
  • 4. ということで、 Rust で macOS の Hypervisor framework を 触ってみることにした
  • 5. macOS Hypervisor framework とは Virtual Memory Threads Mach AppleHV.kext hv_task_trap() hv_thread_trap() VMX Driver Hypervisor Virtualized XXX (仮想マシン、仮想OSなど) ユーザプロセス (ユーザタスク) Rust crate xhypervisor crate hypervisor もあるが メンテされてない模様 Apple から提供される API は C, Swift macOS kernel (Darwin) ・・・ BSD • 仮想化のための軽量なハイパバイザフレームワーク • Intel VMX をユーザプロセスから簡単に利用できる • カーネルエクステンション AppleHV への橋渡しをする Hypervisor.framework
  • 7. fn main() -> Result<(),Error> { create_vm()?; let mut mem = vec![0u8; MEMSIZE]; map_mem(&mem, 0, &perm)?; let handle = thread::spawn(|| { // VCPUが複数なら、その数のスレッドを起動 let vcpu = vCPU::new()?; VCPUの設定; メモリ上にプログラムやデータを配置; レジスタの設定; loop { vcpu.run(); // VMENTER → VCPUの実行 → VMEXIT match vcpu.read_vmcs(VMCS_RO_EXIT_REASON)? { vmx_exit::VMX_REASON_EXC_NMI => 例外やNMIの処理, vmx_exit::VMX_REASON_HLT => break, ... } } vcpu.destroy()?; }); handle.join()?; unmap_mem(0, MEMSIZE)?; destroy_vm()?; }
  • 8. DOSを動かしてみる • C++ DOS エミュレータ(https://github.com/mist64/hvdos.git)を利用 • ハイパバイザと同じ空間で動作 • DOSシステムコール(INT xxH, AH=yy)相当を Unix システムコールで実装 • DOS 2.x システムコール 87 個のうち 29 個を実装(オリジナルに3個追加) • ハイパバイザ(Rust) • VCPU を 16bit リアルモード用に設定し、DOS プログラムをメモリに貼り付け、IP と SP を設定して、vcpu.run() • INT が発生 → VMEXIT → 割り込み番号を取り出し、ラッパー経由でDOS エミュレー タを呼び出す
  • 10. • ソースコードは github で公開 • https://github.com/moriai/hvdos.rs.git • 次回は 64bit OS & 完全 Rust 化にトライ? おわりに