2019-01-01から1年間の記事一覧

BPF_PROG_TYPE_RAW_TRACEPOINT (raw tracepoint) について

BPFのプログラムタイプの一つにBPF_PROG_TYPE_RAW_TRACEPOINTがあります (commit).これを利用するとtracepointの変換前の引数にアクセスすることができます. 例としてkernel/sched/core.cで定義されるsched_swtich のtracepointを考えます. trace_sched_s…

BPFプログラムからカーネル内のデータ構造にアクセスする方法

kprobeやtracepointなどにアタッチしたBPFプログラムは,BPF_FUNC_probe_read()関数でカーネル内のデータ構造にアクセスすることができます.これはprobe_kernel_read()のラッパーで,もし変な領域にアクセスしようした場合(page faultが発生した場合)は-E…

RustでUnix Domain Socketを扱う方法

"rust domain socket"とかで検索するといろいろ引っかかるけどいかんせんライブラリの更新が早くて情報が古かったりするのでここに現状を書きます(この文章もすぐに古くなるかもしれないので後から読む人は注意してください..) 基本 std::os::unix::net 元…

Rustのasync/awaitを使ったecho serverの実装

rust 1.39でasync/await構文が安定化されます. 巷で話題の機能ですが,asycn/await何も分からん...ということで話題に乗り遅れないためにasync/awaitを利用してecho serverを実装してみます. OSはLinuxが対象です.ソースはここにあります. echo server a…

x2APICとinterrupt remapping

以前IOAPICやMSI/MSI-Xを利用するデバイスでx2apicを利用するにはinterrupt remapingを利用すると書きました. 今回実際のマッピングを調べることがあったので,ここに要点をまとめます. 図はVT-dのドキュメントからの引用です. 前提 Interrupt Remapping…

複数の仮想ページに同じ物理ページをマッピングする方法 (Linux)

小ネタ. Linuxで複数の仮想ページを一つの物理ページにマッピングする方法です. 連続した仮想ページを全て同じ物理ページにマッピングしたいということがあって,原理的にはページテーブルで同じ領域を指すだけです.でもユーザ空間からはどうするんだっけ…

American Fuzzy Lop (AFL)の構造

AFLとは American Fuzzy Lop (AFL)はファジングツールの一つです. ファジングとはプログラムの脆弱性検査手法の一つで,簡単に言ってしまえばあるプログラムをランダムな引数で実行することを繰り返して,プログラムがクラッシュするような入力を探そうとい…

NVDIMMとACPI

DIMMに刺せる不揮発性メモリ(NVDIMM*1 )はACPIからどのように扱われるかというメモ. TL;DR ACPIのNFIT (NVDIMM Firmware Interaface Table)に情報が入っています. QEMUでのエミュレーション QEMUのNVDIMMエミュレーションで確認します. https://github.co…

クロスプラットフォームなハイパーバイザ 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() =…