SlideShare a Scribd company logo
第七回 カーネル/VM探検隊発表
x86-64/Linuxに独自メモリ空間を勝手増設

                 中村 実
        nminoru1975@gmail.com
          Twitter @nminoru_jp
   http://www.nminoru.jp/~nminoru/

                                     1
自己紹介
• 某電機メーカーのサラリーマンです。

• 01~05 Java VM
• 06~10 メインフレームのソフトエミュ
  レータ
• 11    ファイルシステム



                         2
エミュレータを高速化するに
      は?
• ゲストとホストでCPUが異なる計算機を想
  定
 – ARM、MIPS、SPARC、Alphaをx86-64上で実行


• ゲストの仮想メモリがネック
 – ソフトウェアでエミュレーションすると絶対
   的に遅い
 – ホストのMMUを使ってゲストのメモリ空間を
   エミュレーションしましょう。
                                     3
ホストMMUをどうやって使う
      か?
• どうすればいい?
 1. OSを自前で作る
 2. OSから一部のCPUを切り離して独自コードで
    ブート
 3. 既存のOSを改造


 このLTではx86-64/Linux上で32ビットCPUを
 エミュレーションする勝手改造を紹介しま
                 す
                                 4
オレオレVM
• Linux仮想メモリ(VM)中に自分専用のVMを!
  – https://github.com/nminoru/oleolevm/
    x86風の2段のページテーブルを持つCPUを仮定

• 使い方
  – /proc/oleolevm を mmap
  – CPU 命令のインタプリータがロード・ストア
  – TLB ミスフォルト・保護違反フォルトは SIGSEGV シグナル
    で通知
                          Memory
                                            Load/Store
                 mmap
                                                         CPU Interpreter
/proc/oleolevm             oleolevm
                                            SIGSEGV


                        ioctol or syscall                              5
どのように改造するか?
• Hugetlb を参考に (`・ω・´)
• vm_area_structのvm_flagsを勝手に追加
  – /include/linux/mm.h
     #define VM_HUGETLB 0x00400000
     #define VM_OLEOLETLB 0x100000000UL

• VM_HUGETLBとis_vm_hugetlb_pageを手掛
  かりに追加
     if (is_vm_hugetlb_page(vma))
           return copy_hugetlb_page_range(dst_mm, src_mm, vma);

     if (is_vm_oleoletlb_page(vma))
           return -ENOMEM;                                        6
Shadow Page Table(SPT)
  • ゲストの仮想メモリ空間をホストのページテーブルに
    組み込む。
                                          CR3
            oleolevm      0x3,000,000

       Guest Virt Space                                 PGD

                Page                            512GB
                          0x2,000,000                   PUD

            空き4GB                                1GB
写像                        0x1,000,000                   PMD
       Guest Phy Space
                                                 2MB
                Page                                     PTE

gCR3   ST        PT                              4KB
                          0x0,000,000
                                        Page
                                                               7
サンプルはここまでで力尽きま
      した




                 8
ゲストCR3を切り替え対応
 • ゲストのコンテキストスイッチに応じてSPTの書き換
   えが必要
 • 毎回破棄するとコスト高なので過去のSPTも保存
      – PUDをゲスト仮想空間1つに割り当てると効率がイイ!!
         CR3

         PGD                          PMD   PMD   PMD   PMD
                           CR3が変更され
                           たら入れ替え
  PUD                                 PTE   PTE   PTE   PTE

                     1GB

                                      PMD   PMD   PMD   PMD
PMD     PMD    PMD         PMD
                                      PTE   PTE   PTE   PTE
PTE     PTE    PTE         PTE
                                                              9
ゲストモード対応
• ゲストにもuser modeとsupervisor modeがあり
  アクセス禁止領域が違う
• User mode用とsupervisor mode用の空間を分
  けてしまえば解決
        Guest Virt Space
         (Supervisor)
             空き            CPU Interpreter
        Guest Virt Space
            (User)
             空き

        Guest Phy Space
                                             10
JITコンパイラ対応
• 高速化のためのJIT Compilation
  – Dynamic Binary Translationとも言う

• 分岐回数テーブル
  – 普通はハッシュテーブル
                                     Branch Counter Table
  – オレオレVMならMMUで用意
• 翻訳コードへのlookup table                   Page    カウン
                                                 タ
  – これもMMUで用意できる
• 翻訳元コードの書込み保護                                 空き
  – 書込み保護違反が起きた時、                      Guest Virt Space
    カーネル側で翻訳コードの破棄
    が可能                                 Page
                                                命令


                                                            11
ゲストデバッグ機能対応
• Watchpoint Debug
  – 指定したメモリ範囲にアクセスがあったことを検
    出
• 問題
  – アクセスの補足方法
     • x86のdebug registerはエミュは使い辛い
     • ゲストのwatchpoint範囲をカバーするようにSPTのペー
       ジにプロテクションを付ける
  – アドレスの判定
  – Watchpointに引っかかったx86命令の再実行方法
                                         12
アドレス判定
• #PF例外はCR2に例外を起こしたメモリアドレ
  スを返すが不正確
 – movq %rax, [0x0FFE] で #PF 例外が出る場合、CR2
   は0x1000になるかも。
• x86命令をデコードしてアドレスを判定
 – struct pt_regsに#PFが起きた時点のレジスタが格納
   されている
 – %ripから16バイトを読み込んで命令をデコード
 – でもオペコードレベルで400命令以上のデコード
   が必要 (´;ω;`)

                                           13
再実行
• ゲストのLOAD/STOREは#PF例外補足後に再実
  行できないとダメ
  – でもSPTにプロテクションをかけているよ
• x86を1命令エミュレーション
  – #PFを起こしたx86命令をカーネルランドで1命令
    エミュし、pt_regsに結果を書き戻す。%ripも1命
    令分続ける。
• x86のSingle Step実行を使う
  1. #PFハンドラでSPTのプロテクションを解除し、
     EFLAGSにTFを立ててユーザランドに戻る
  2. 1命令を実行したら#DB例外が発生
  3. SPTのプロテクションを元に戻す
                                   14
まとめ
• オレオレVMを使えばx86-64のMMUを全部
  使える (`・ω・´)

• でもカーネルのリベースが大変 (´;ω;`)

• なにかうまい手はありませんか?



                            15
参考文献
• Jim Smith, Ravi Nair, Virtual Machines:
  Versatile Platforms for Systems and Processes




                                                  16
清聴ありがとうございました。




             17
ここから未使用




          18
予約領域を使う
• x86/x86-64は#PF例外の種類が少ない
• #PF例外時のエラーコード
 – Present bit
 – W/R bit
 – U/S bit
• そうだ!! 予約領域を使おう
 – RSVD


                            19
SPTの一貫性(1/2)
• ゲストのページテーブルとSPTの一貫性の維
  持するには?
 1. ゲストのページテーブル領域に書込み保護をか
    ける
 2. 毎回SPTを破棄
 3. 毎回SPTをゲストのページテーブルとチェック
• x86-64の予約領域を使ってSPTのチェックを
  遅延させる方法があるよ
 – 特許4897578「仮想計算機の制御プログラムおよ
   び仮想計算機システム」服部 直也ほか

                               20
SPTの一貫性(2/2)
• 予約領域へビットを打った場合「SPTを
  チェックしろ」という意味
• RSVD=1の#PF例外をハンドルして検査
• 最初はPGDのreserved bitを打つ。
• #PF例外があがるとPGDのreserved bitを解除し
  て直下のPUDの512エントリにresreved bitを打
  つ。
• 中位のエントリのreserved bitを下位のテーブ
  ルに写してゆく。
• 最後のPTEのreserved bitを解除する時にゲス
  トPTEとチェックを行う
                               21
改造なしで独自メモリ管理
• vm_area_structにvm_opsを設定
 static int foo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
     vmf->page = page; // ここにロジックを入れる
 }

 static struct vm_operations_struct foo_vm_ops = {
      .fault = foo_vm_fault,
 };

 static int foo_mmap(struct file *filp, struct vm_area_struct *vma)
 {
      vma->vm_ops = &foo_vm_ops;
 }

 static struct file_operations foo_fops = {
      .mmap = foo_mmap,
 };

                                                                             22
X86-64の仮想メモリは将来拡張さ
          れるか?
• U.S. Patent 6,671,791 Processor including a translation
  unit for selectively translating virtual addresses of
  different sizes using a plurality of paging tables and
  mapping mechanisms




                                                        23

More Related Content

What's hot

BHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorBHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorTakuya ASADA
 
Basic of virtual memory of Linux
Basic of virtual memory of LinuxBasic of virtual memory of Linux
Basic of virtual memory of Linux
Tetsuyuki Kobayashi
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
Hirotaka Kawata
 
4章 Linuxカーネル - 割り込み・例外 4
 4章 Linuxカーネル - 割り込み・例外 4 4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
mao999
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
Takuya ASADA
 
Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!
Etsuji Nakai
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話
nullnilaki
 
LXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoyaLXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoya
Masahide Yamamoto
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
sandai
 
HDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13wHDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13w
Cloudera Japan
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
LINE Corporation
 
【学習メモ#3rd】12ステップで作る組込みOS自作入門
【学習メモ#3rd】12ステップで作る組込みOS自作入門【学習メモ#3rd】12ステップで作る組込みOS自作入門
【学習メモ#3rd】12ステップで作る組込みOS自作入門
sandai
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
MITSUNARI Shigeo
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
sandai
 
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)Takeshi HASEGAWA
 

What's hot (20)

BHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorBHyVe: The BSD Hypervisor
BHyVe: The BSD Hypervisor
 
Bhyve Internals
Bhyve InternalsBhyve Internals
Bhyve Internals
 
KVM+cgroup
KVM+cgroupKVM+cgroup
KVM+cgroup
 
Basic of virtual memory of Linux
Basic of virtual memory of LinuxBasic of virtual memory of Linux
Basic of virtual memory of Linux
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
4章 Linuxカーネル - 割り込み・例外 4
 4章 Linuxカーネル - 割り込み・例外 4 4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
 
Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話
 
LXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoyaLXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoya
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
HDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13wHDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13w
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
 
【学習メモ#3rd】12ステップで作る組込みOS自作入門
【学習メモ#3rd】12ステップで作る組込みOS自作入門【学習メモ#3rd】12ステップで作る組込みOS自作入門
【学習メモ#3rd】12ステップで作る組込みOS自作入門
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
retrobsd-2012-JUL-07 at JNUG BSD BoF
retrobsd-2012-JUL-07 at JNUG BSD BoFretrobsd-2012-JUL-07 at JNUG BSD BoF
retrobsd-2012-JUL-07 at JNUG BSD BoF
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38)
 

Viewers also liked

つくっておぼえる!仮想マシン〜直前で実装編〜
つくっておぼえる!仮想マシン〜直前で実装編〜つくっておぼえる!仮想マシン〜直前で実装編〜
つくっておぼえる!仮想マシン〜直前で実装編〜
Eric Sartre
 
Xとかオワコン?
Xとかオワコン?Xとかオワコン?
Xとかオワコン?Naohiro Aota
 
0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム
Minoru Nakamura
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelMinoru Nakamura
 
軽快なPlan 9 Update - Illumos KVM上陸 -
軽快なPlan 9 Update - Illumos KVM上陸 -軽快なPlan 9 Update - Illumos KVM上陸 -
軽快なPlan 9 Update - Illumos KVM上陸 -
Go Saito
 
Jvm reading-synchronization
Jvm reading-synchronizationJvm reading-synchronization
Jvm reading-synchronizationMinoru Nakamura
 
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
Minoru Nakamura
 
Nyarlathotep
NyarlathotepNyarlathotep
Nyarlathotep
Hiromu Yakura
 
Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025
HPCシステムズ株式会社
 
SC16 NVIDIA NEWS
SC16 NVIDIA NEWSSC16 NVIDIA NEWS
SC16 NVIDIA NEWS
Kuninobu SaSaki
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSLurasandesu
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例について
Masanori Itoh
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
Naoto MATSUMOTO
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例
Naoto MATSUMOTO
 
MPIによる並列計算
MPIによる並列計算MPIによる並列計算
MPIによる並列計算
HPCシステムズ株式会社
 
家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)
家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)
家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)Kazuya Numata
 

Viewers also liked (20)

つくっておぼえる!仮想マシン〜直前で実装編〜
つくっておぼえる!仮想マシン〜直前で実装編〜つくっておぼえる!仮想マシン〜直前で実装編〜
つくっておぼえる!仮想マシン〜直前で実装編〜
 
Listen grep
Listen grepListen grep
Listen grep
 
Xとかオワコン?
Xとかオワコン?Xとかオワコン?
Xとかオワコン?
 
0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム
 
Jvm reading-parallel gc
Jvm reading-parallel gcJvm reading-parallel gc
Jvm reading-parallel gc
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-Model
 
軽快なPlan 9 Update - Illumos KVM上陸 -
軽快なPlan 9 Update - Illumos KVM上陸 -軽快なPlan 9 Update - Illumos KVM上陸 -
軽快なPlan 9 Update - Illumos KVM上陸 -
 
Jvm reading-synchronization
Jvm reading-synchronizationJvm reading-synchronization
Jvm reading-synchronization
 
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
 
Nyarlathotep
NyarlathotepNyarlathotep
Nyarlathotep
 
軽快なBHyVe
軽快なBHyVe軽快なBHyVe
軽快なBHyVe
 
Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025
 
SC16 NVIDIA NEWS
SC16 NVIDIA NEWSSC16 NVIDIA NEWS
SC16 NVIDIA NEWS
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例について
 
JVM-Reading-ParalleGC
JVM-Reading-ParalleGCJVM-Reading-ParalleGC
JVM-Reading-ParalleGC
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例
 
MPIによる並列計算
MPIによる並列計算MPIによる並列計算
MPIによる並列計算
 
家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)
家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)
家族のためにエンジニアとしてやってみたこと(What I did for my family as an engineer)
 

Similar to x86-64/Linuxに独自メモリ空間を勝手増設

PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価
Toshiaki Hishinuma
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
MITSUNARI Shigeo
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
えむ ばーど
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
Tetsuyuki Kobayashi
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
Kuniyasu Suzaki
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
株式会社サードウェア
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI) Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Hiroshi Matsumoto
 
Effective Hyper-V - 久しぶりエディション
Effective Hyper-V - 久しぶりエディションEffective Hyper-V - 久しぶりエディション
Effective Hyper-V - 久しぶりエディション
Kuninobu SaSaki
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1Etsuji Nakai
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
Mr. Vengineer
 
MongoDB on AWS
MongoDB on AWSMongoDB on AWS
MongoDB on AWS
Ryuji Tamagawa
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
Isca13 study
Isca13 studyIsca13 study
Isca13 study
Toshiya Komoda
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Masanobu Saitoh
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
たけおか しょうぞう
 

Similar to x86-64/Linuxに独自メモリ空間を勝手増設 (20)

PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
 
Open VZ
Open VZOpen VZ
Open VZ
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
 
仮想記憶の構築法
仮想記憶の構築法仮想記憶の構築法
仮想記憶の構築法
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI) Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
 
Effective Hyper-V - 久しぶりエディション
Effective Hyper-V - 久しぶりエディションEffective Hyper-V - 久しぶりエディション
Effective Hyper-V - 久しぶりエディション
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 
MongoDB on AWS
MongoDB on AWSMongoDB on AWS
MongoDB on AWS
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Isca13 study
Isca13 studyIsca13 study
Isca13 study
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
 

x86-64/Linuxに独自メモリ空間を勝手増設

  • 1. 第七回 カーネル/VM探検隊発表 x86-64/Linuxに独自メモリ空間を勝手増設 中村 実 nminoru1975@gmail.com Twitter @nminoru_jp http://www.nminoru.jp/~nminoru/ 1
  • 2. 自己紹介 • 某電機メーカーのサラリーマンです。 • 01~05 Java VM • 06~10 メインフレームのソフトエミュ レータ • 11 ファイルシステム 2
  • 3. エミュレータを高速化するに は? • ゲストとホストでCPUが異なる計算機を想 定 – ARM、MIPS、SPARC、Alphaをx86-64上で実行 • ゲストの仮想メモリがネック – ソフトウェアでエミュレーションすると絶対 的に遅い – ホストのMMUを使ってゲストのメモリ空間を エミュレーションしましょう。 3
  • 4. ホストMMUをどうやって使う か? • どうすればいい? 1. OSを自前で作る 2. OSから一部のCPUを切り離して独自コードで ブート 3. 既存のOSを改造 このLTではx86-64/Linux上で32ビットCPUを エミュレーションする勝手改造を紹介しま す 4
  • 5. オレオレVM • Linux仮想メモリ(VM)中に自分専用のVMを! – https://github.com/nminoru/oleolevm/ x86風の2段のページテーブルを持つCPUを仮定 • 使い方 – /proc/oleolevm を mmap – CPU 命令のインタプリータがロード・ストア – TLB ミスフォルト・保護違反フォルトは SIGSEGV シグナル で通知 Memory Load/Store mmap CPU Interpreter /proc/oleolevm oleolevm SIGSEGV ioctol or syscall 5
  • 6. どのように改造するか? • Hugetlb を参考に (`・ω・´) • vm_area_structのvm_flagsを勝手に追加 – /include/linux/mm.h #define VM_HUGETLB 0x00400000 #define VM_OLEOLETLB 0x100000000UL • VM_HUGETLBとis_vm_hugetlb_pageを手掛 かりに追加 if (is_vm_hugetlb_page(vma)) return copy_hugetlb_page_range(dst_mm, src_mm, vma); if (is_vm_oleoletlb_page(vma)) return -ENOMEM; 6
  • 7. Shadow Page Table(SPT) • ゲストの仮想メモリ空間をホストのページテーブルに 組み込む。 CR3 oleolevm 0x3,000,000 Guest Virt Space PGD Page 512GB 0x2,000,000 PUD 空き4GB 1GB 写像 0x1,000,000 PMD Guest Phy Space 2MB Page PTE gCR3 ST PT 4KB 0x0,000,000 Page 7
  • 9. ゲストCR3を切り替え対応 • ゲストのコンテキストスイッチに応じてSPTの書き換 えが必要 • 毎回破棄するとコスト高なので過去のSPTも保存 – PUDをゲスト仮想空間1つに割り当てると効率がイイ!! CR3 PGD PMD PMD PMD PMD CR3が変更され たら入れ替え PUD PTE PTE PTE PTE 1GB PMD PMD PMD PMD PMD PMD PMD PMD PTE PTE PTE PTE PTE PTE PTE PTE 9
  • 10. ゲストモード対応 • ゲストにもuser modeとsupervisor modeがあり アクセス禁止領域が違う • User mode用とsupervisor mode用の空間を分 けてしまえば解決 Guest Virt Space (Supervisor) 空き CPU Interpreter Guest Virt Space (User) 空き Guest Phy Space 10
  • 11. JITコンパイラ対応 • 高速化のためのJIT Compilation – Dynamic Binary Translationとも言う • 分岐回数テーブル – 普通はハッシュテーブル Branch Counter Table – オレオレVMならMMUで用意 • 翻訳コードへのlookup table Page カウン タ – これもMMUで用意できる • 翻訳元コードの書込み保護 空き – 書込み保護違反が起きた時、 Guest Virt Space カーネル側で翻訳コードの破棄 が可能 Page 命令 11
  • 12. ゲストデバッグ機能対応 • Watchpoint Debug – 指定したメモリ範囲にアクセスがあったことを検 出 • 問題 – アクセスの補足方法 • x86のdebug registerはエミュは使い辛い • ゲストのwatchpoint範囲をカバーするようにSPTのペー ジにプロテクションを付ける – アドレスの判定 – Watchpointに引っかかったx86命令の再実行方法 12
  • 13. アドレス判定 • #PF例外はCR2に例外を起こしたメモリアドレ スを返すが不正確 – movq %rax, [0x0FFE] で #PF 例外が出る場合、CR2 は0x1000になるかも。 • x86命令をデコードしてアドレスを判定 – struct pt_regsに#PFが起きた時点のレジスタが格納 されている – %ripから16バイトを読み込んで命令をデコード – でもオペコードレベルで400命令以上のデコード が必要 (´;ω;`) 13
  • 14. 再実行 • ゲストのLOAD/STOREは#PF例外補足後に再実 行できないとダメ – でもSPTにプロテクションをかけているよ • x86を1命令エミュレーション – #PFを起こしたx86命令をカーネルランドで1命令 エミュし、pt_regsに結果を書き戻す。%ripも1命 令分続ける。 • x86のSingle Step実行を使う 1. #PFハンドラでSPTのプロテクションを解除し、 EFLAGSにTFを立ててユーザランドに戻る 2. 1命令を実行したら#DB例外が発生 3. SPTのプロテクションを元に戻す 14
  • 15. まとめ • オレオレVMを使えばx86-64のMMUを全部 使える (`・ω・´) • でもカーネルのリベースが大変 (´;ω;`) • なにかうまい手はありませんか? 15
  • 16. 参考文献 • Jim Smith, Ravi Nair, Virtual Machines: Versatile Platforms for Systems and Processes 16
  • 19. 予約領域を使う • x86/x86-64は#PF例外の種類が少ない • #PF例外時のエラーコード – Present bit – W/R bit – U/S bit • そうだ!! 予約領域を使おう – RSVD 19
  • 20. SPTの一貫性(1/2) • ゲストのページテーブルとSPTの一貫性の維 持するには? 1. ゲストのページテーブル領域に書込み保護をか ける 2. 毎回SPTを破棄 3. 毎回SPTをゲストのページテーブルとチェック • x86-64の予約領域を使ってSPTのチェックを 遅延させる方法があるよ – 特許4897578「仮想計算機の制御プログラムおよ び仮想計算機システム」服部 直也ほか 20
  • 21. SPTの一貫性(2/2) • 予約領域へビットを打った場合「SPTを チェックしろ」という意味 • RSVD=1の#PF例外をハンドルして検査 • 最初はPGDのreserved bitを打つ。 • #PF例外があがるとPGDのreserved bitを解除し て直下のPUDの512エントリにresreved bitを打 つ。 • 中位のエントリのreserved bitを下位のテーブ ルに写してゆく。 • 最後のPTEのreserved bitを解除する時にゲス トPTEとチェックを行う 21
  • 22. 改造なしで独自メモリ管理 • vm_area_structにvm_opsを設定 static int foo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { vmf->page = page; // ここにロジックを入れる } static struct vm_operations_struct foo_vm_ops = { .fault = foo_vm_fault, }; static int foo_mmap(struct file *filp, struct vm_area_struct *vma) { vma->vm_ops = &foo_vm_ops; } static struct file_operations foo_fops = { .mmap = foo_mmap, }; 22
  • 23. X86-64の仮想メモリは将来拡張さ れるか? • U.S. Patent 6,671,791 Processor including a translation unit for selectively translating virtual addresses of different sizes using a plurality of paging tables and mapping mechanisms 23