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

Rust で Hypervisor.framework を 触ってみた(DOS編)

Rust で Hypervisor.framework を 触ってみた(DOS編)

Rust で macOS の Hypervisor.framework をちらっと触ってみて、DOSエミュレータをつなげた話です。

Satoshi Moriai

January 27, 2020
Tweet

Other Decks in Technology

Transcript

  1. ࣗݾ঺հ • ੝߹ හʢSatoshi Moriai / Shiisaa Moriaiʣ • https://github.com/moriai

    • https://twitter.com/moriai19 • ੲ͸ OSʢMach / Real-Time Mach, Linuxʣ΍
 ʢ෼ࢄʣϑΝΠϧγεςϜͷ։ൃΛ͍ͯͨ͠ • ࠓ͸ … • झຯͰ Rust ΍ Swift ͱٔΕΔ
  2. ΍ͬͯΈ͍ͨ͜ͱ • Rust ΍࠷৽ٕज़Ͱ෼ࢄܕ OS ͷ։ൃ͕গ͠͸ָʹͳΔ͔΋ • Mach Λ C

    Ͱ։ൃ͢Δͷ͸େมͩͬͨ • ΠϯλʔϑΣʔε͕ໃ६ͨ͠ίʔυͰ΋ϏϧυͰ͖ɺ
 σόοάʹແବͳ࿑ྗΛඅ΍ͨ͠ • ϑϧϏϧυ͸͔͔࣌ؒΓ͗͢ɺΠϯΫϦϝϯλϧϏϧυ͸ ෆ׬શ • macOS ͕޷͖ͳͷͰɺ΋ͬͱ࿔ΜͰΈ͍ͨ
  3. 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
  4. ɹ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()?; ɹ}
  5. DOSΛಈ͔ͯ͠ΈΔ • C++ DOS ΤϛϡϨʔλʢhttps://github.com/mist64/hvdos.gitʣΛར༻ • ϋΠύόΠβͱಉۭؒ͡Ͱಈ࡞ • DOSγεςϜίʔϧʢINT xxH,

    AH=yyʣ૬౰Λ Unix γεςϜίʔϧͰ࣮૷ • DOS 2.x γεςϜίʔϧ 87 ݸͷ͏ͪ 29 ݸΛ࣮૷ʢΦϦδφϧʹ̏ݸ௥Ճʣ • ϋΠύόΠβʢRustʣ • VCPU Λ 16bit ϦΞϧϞʔυ༻ʹઃఆ͠ɺDOS ϓϩάϥϜΛϝϞϦʹషΓ෇͚ɺIP ͱ SP Λઃఆͯ͠ɺvcpu.run() • INT ͕ൃੜ → VMEXIT → ׂΓࠐΈ൪߸ΛऔΓग़͠ɺϥούʔܦ༝ͰDOS ΤϛϡϨʔ λΛݺͼग़͢ → vcpu.run()