クロスプラットフォームなハイパーバイザ Intel HAXM

HAXM (Hardware Accelerated Execution Manager)はIntelが作成しているハイパーバイザです.もとはAndroid Emulatorのバックエンドとして開発が開始されたもののようです. 以下のような特徴があります. KVMのようなインタフェース QEMUのサポート クロスプ…

KVMの準仮想化機能

KVMにはいくつか準仮想化インタフェースが存在します. KVMはHWによる仮想化支援機構を利用してゲストを実行するので,準仮想化機能を使用しなくても任意のOSが実行できますが,準仮想化機能を利用することでVMのパフォーマンスを向上できる場合があります.…

KVMにおけるcpuid命令の取り扱い

前提 x86/Intelの話です.AMDでも多分同様. cpuid命令の取り扱い cpuid命令はKVM内で処理されます. 具体的には arch/x86/kvm/vmx.c:handle_cpuid() => arch/x86/kvm/cpuid.c:kvm_emulate_cpuid() => arch/x86/kvm/cpuid.c:kvm_cpuid() => arch/x86/kvm/cpu…

rustのIteratorの実装

関連するトレイト Iterator libcore/iter/traits/itetarot.rs pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; ... } イテレータの関数のためのトレイト next()さえ実装すれば,あとはデフォルト定義が存在 IntoIterator libcore/iter/trait</self::item>…

rustのArcについてその2

前回 以下で利用したplaygroundのリンク スライスからのArcの作成 Arcのソースをみていて気づきましたが,impl<T: Clone> From<&[T]> for Arc<[T]>などが実装されており,CopyあるいはCloneが実装されているスライスからArcを作成することができます.(RCも同様です)</t:>…

rustのMutexの内部構造

前回に引き続き,今度はMutexの話です. Raph Levien氏の図を引用すると,Mutexは以下のような構造になっています. Raph Levien, Copyright 2017 Google Inc., released under Creative Commons BY また,データ構造としては以下のように定義されています(…

rustのArcの内部構造

rustのスマートポインタの構成については,Raph Levien氏の以下の図が参考になります. Rust container cheat sheet 今回はここで特にArcについて見ていきたいと思います. Arcは以下のように定義されています(一部抜粋). pub struct Arc<T: ?Sized> { ptr: NonNull<ArcInner<T>></arcinner<t></t:>…

QEMU/KVM上のゲストのハイパーコールをQEMU側に渡す方法

前回説明したように,KVMでは,ゲストのハイパーコール(Intel CPUの場合はVMCALL命令,AMDの場合はVMMCALL命令)はKVM側で処理され,ioctl側に戻ることなくゲストに戻ります. QEMU/KVMにおいて,独自にハイパーコールを追加してQEMU側で処理するには修正が…

QEMUコードリーディングメモ

主にイベントループとKVM周り. QEMU v3.1.0 Linux v4.20 ターゲット: x86 QEMU Main Loop QEMUの主処理はGLibを使ったイベントループ. ゲストのvCPUは別のスレッドで実行(後述) vl.c:main() => vl.c:main_loop() => util/main-loop.c:main_loop_wait() =…

Bareflankを使ってみる

vmm

前から気になっていたBareflankを少し触って見ました. あまりドキュメントがないようなので半分メモがてらBareflankについて書いてみます. BareflankはいわゆるThin-hypervisorの一種です. 複数VMの動作を目的とする通常のハイパーバイザとは異なり,その…

VFIOによるデバイス操作

VFIO (Virtual Function I/O)はLinuxにおいてユーザスペースでデバイスを操作するためのフレームワークの一つです. ユザースペースドライバといえばuioもありますが,uioとVFIOの主要な違いの一つはVFIOはIOMMUを利用するという点です*1.uioはLinux 2.6.23…

KVM GPUパススルー設定

環境 i7-4790 (with VT-d) GeForce GTX 1080ti Linux Mint 18.3 Sylvia (Ubuntu xenial base) Cinnamon やりたいこと KVM上のWindowsにGPUをパススルーで接続する 現在GPUはcuda計算用に利用 (ディスプレイはi915).Windowsを使うときだけパススルーさせたい…

ACPI DMARメモ

IOMMUの情報はACPIのDMARに格納されている DMARのデータ構造は,Intel VT-d ドキュメント (Intel® Virtualization Technology for Directed I/O) の8章に書いてある ざっくり以下のような構造 DMAR (DMA Remapping Table) DRHD (DMA Remapping Hardware Unit…

perf, ftraceのしくみ

Linuxのトレーサーであるperfやftraceのツールの使い方に関する情報は結構ありますが,構造に関してはあまり見つけられなかったため,ここに簡単に調べたことをまとめようかと思います.(ツールの使い方の説明はあんまりしないです.) この文章はLinux 4.1…

VMWare Fusionメモ

以下はVMWare Fusion 10.1.1 (macOS High Sierra 10.13.3)で動作確認したものです. 設定ファイル(xxx.vmx)はVM停止中に変更する必要があります(そうでないと書き換わることがある). コマンドラインツール /Applications/VMware\ Fusion.app/Contents/L…

SpectreとeBPF

新年早々巷にいろいろと賑わいをもたらしたSpectreとMeltdownですが,Google Project Zero (GPZ)が公表したSpectreの攻撃コード例の中でeBPFが使用されていました. 安全を謳っているものの昨年もいくつか脆弱性が発見されていたので,「またeBPFか」と思っ…

x86におけるメモリアクセス権のルール

x86

定期的に忘れる気がするのでメモ.SDM Volume 3A 4.1.3, 4.6参照. 用語 supervisor mode access CPL < 3 でのアクセス user mode access CPL == 3 でのアクセス supervisor mode address page entryのU/S bitが一つでも0である領域*1 user mode addres super…

Ownership is theft? TockのTakeCellについて

tockというrust製の組み込み向けOSがあります. このtockの作成者らが2015年にOwnership is Theft: Experiences Building an Embedded OS in Rust (PLOS 2015)という論文を発表しました.そこでは著者がtockを開発する上で嵌ったownershipに関する問題と,そ…

cBPFプログラムをLLVM IRに変換する

最近Linuxでいろいろと大活躍のBPF (Berkeley Packet Filter)には主に2種類あって,一番最初に提唱されlibpcapなどで利用されるcBPF (classic BPF)と,主にLinux内で現在利用されている,cBPFをベースに拡張したeBPF (extended BPF)があります. cBPFのプロ…

LinuxのBPF : (5) eBPFによるLinux Kernel Tracing

eBPFによるカーネルトレース 一番最初に書いた通り,eBPFはLinuxのトレーサとして利用できます. カーネルがeBPFプログラムを実行する場合,BPFインタプリタにctxが渡されます(jit化されている場合も同様です). https://github.com/torvalds/linux/blob/v…

LinuxのBPF : (4) ClangによるeBPFプログラムの作成と,BPF Compiler Collection (BCC)

Clangを利用したeBPFプログラムの作成 eBPFへのコンパイル llvm IRの出力 eBPFアセンブリの出力 eBPFプログラムの出力 カーネルで動作するeBPFプログラムの例 skbuffからのロード eBPF mapの処理 BPF Compiler Collection (BCC) インストール bccによるプロ…

LinuxのBPF : (3) eBPFの基礎

はじめに(注意) extended BPF (eBPF) eBPF map eBPFプログラムの例 eBPFのmapの作成 eBPFプログラムの作成 eBPFフィルタプログラムの利用 setsockoptの挙動 JIT ソース まとめ はじめに(注意) ちょうど一年ぐらい前にLinuxのBPFについて記事を書いていま…

nomによるnumpyデータのパース

nom nomはrust製のパーサコンビネーターライブラリです. 個人的にはno_stdでの動作をサポートしてる点が嬉しいです. 今回勉強のためにnomでnumpyのファイル(のヘッダ)をパースしてみます. numpyのフォーマット 今回は以下のようにして作成したデータを…

[rust]ZST/DSTによるflexible array memberの実現

flexible array memberとは ZSTを使う方法 DSTを使う方法 flexible array memberとは flexible array memberとはずばり,C言語で以下のようなサイズ定義を持たない構造体メンバのことです(C99から標準). struct X{ size_t len; char value[]; } この構造…

rustで動的にバッファを確保する方法

Boxを使う Vecを使う std::heap::Allocを使う placement-in を使う mallocを使う 1. Boxを使う rustで動的にメモリを確保する方法といってまず思いつくのはBoxを使う方法だと思います.例えば,以下のようにすれば長さ1000のu8のバッファを確保できます. le…

rustをnostdで使う

nostdとは rustは他の多くの言語と同様,標準ライブラリ(std)が同包されており,通常はそれを使ってプログラミングをおこないます.しかしながら,stdの多くの機能はOSの機能を利用しているため,OSそのものを開発したいとか,あるいはOSが存在しない環境で…

rustのGUIライブラリconrodの使い方

所用でrustのGUIライブラリについて調べる機会がありました.特にこれといったGUIライブラリはまだないような気がします. 普段自分がネイティブなGUIアプリケーションを作成する場合はQtを使います.rustからQtを呼び出すのはいくつか試みがあって,disasse…

DPDKのmbufの構造

DPDKではパケットをmbufというデータ構造で管理しています. mbufについては http://dpdk.org/doc/guides/prog_guide/mbuf_lib.html にまとまっていますが,ここでは具体的なmbufの構成や使われ方についてみていきたいと思います. mempoolのおさらい mbufは…

DPDKにおけるメモリ管理

DPDKにおいてどのようにメモリが使用されるかをここにまとめたいと思います. なお,ここに書いてあるものはあくまで私がコードを読んで解釈した結果になります. DPDKのバージョンは17.05,OSはLinuxを対象としています. 全体像 DPDKでは独自のメモリアロ…

DPDKにおけるhugepageの初期化部分

DPDKはhugepageをデフォルトで利用しています.ここではDPDKにおけるhugepageの初期化部分についてまとめようと思います. OSはLinux , DPDKのバージョンはv17.05-rc2です. 初期化のおおまかな流れ librte_eal/linuxapp/eal/eal.c:rte_eal_init()がDPDKの基…