最近Linuxでいろいろと大活躍のBPF (Berkeley Packet Filter)には主に2種類あって,一番最初に提唱されlibpcapなどで利用されるcBPF (classic BPF)と,主にLinux内で現在利用されている,cBPFをベースに拡張したeBPF (extended BPF)があります. cBPFのプロ…
eBPFによるカーネルトレース 一番最初に書いた通り,eBPFはLinuxのトレーサとして利用できます. カーネルがeBPFプログラムを実行する場合,BPFインタプリタにctxが渡されます(jit化されている場合も同様です). https://github.com/torvalds/linux/blob/v…
Clangを利用したeBPFプログラムの作成 eBPFへのコンパイル llvm IRの出力 eBPFアセンブリの出力 eBPFプログラムの出力 カーネルで動作するeBPFプログラムの例 skbuffからのロード eBPF mapの処理 BPF Compiler Collection (BCC) インストール bccによるプロ…
はじめに(注意) extended BPF (eBPF) eBPF map eBPFプログラムの例 eBPFのmapの作成 eBPFプログラムの作成 eBPFフィルタプログラムの利用 setsockoptの挙動 JIT ソース まとめ はじめに(注意) ちょうど一年ぐらい前にLinuxのBPFについて記事を書いていま…
nom nomはrust製のパーサコンビネーターライブラリです. 個人的にはno_stdでの動作をサポートしてる点が嬉しいです. 今回勉強のためにnomでnumpyのファイル(のヘッダ)をパースしてみます. numpyのフォーマット 今回は以下のようにして作成したデータを…
flexible array memberとは ZSTを使う方法 DSTを使う方法 flexible array memberとは flexible array memberとはずばり,C言語で以下のようなサイズ定義を持たない構造体メンバのことです(C99から標準). struct X{ size_t len; char value[]; } この構造…
Boxを使う Vecを使う std::heap::Allocを使う placement-in を使う mallocを使う 1. Boxを使う rustで動的にメモリを確保する方法といってまず思いつくのはBoxを使う方法だと思います.例えば,以下のようにすれば長さ1000のu8のバッファを確保できます. le…
nostdとは rustは他の多くの言語と同様,標準ライブラリ(std)が同包されており,通常はそれを使ってプログラミングをおこないます.しかしながら,stdの多くの機能はOSの機能を利用しているため,OSそのものを開発したいとか,あるいはOSが存在しない環境で…
所用でrustのGUIライブラリについて調べる機会がありました.特にこれといったGUIライブラリはまだないような気がします. 普段自分がネイティブなGUIアプリケーションを作成する場合はQtを使います.rustからQtを呼び出すのはいくつか試みがあって,disasse…
DPDKではパケットをmbufというデータ構造で管理しています. mbufについては http://dpdk.org/doc/guides/prog_guide/mbuf_lib.html にまとまっていますが,ここでは具体的なmbufの構成や使われ方についてみていきたいと思います. mempoolのおさらい mbufは…
DPDKにおいてどのようにメモリが使用されるかをここにまとめたいと思います. なお,ここに書いてあるものはあくまで私がコードを読んで解釈した結果になります. DPDKのバージョンは17.05,OSはLinuxを対象としています. 全体像 DPDKでは独自のメモリアロ…
DPDKはhugepageをデフォルトで利用しています.ここではDPDKにおけるhugepageの初期化部分についてまとめようと思います. OSはLinux , DPDKのバージョンはv17.05-rc2です. 初期化のおおまかな流れ librte_eal/linuxapp/eal/eal.c:rte_eal_init()がDPDKの基…
前回 /proc/pid/pagemap について簡単に触れたので,実際にpagemapを読み取るときどういうことが起きるか少し追ってみようと思います. /proc/pid/pagemapに関する操作はカーネルのfs/proc/task_mmu.c内でproc_pagemap_operationsに定義してあります. https…
××な理由で仮想アドレスではなく実際の物理アドレスを求めたいことがあると思います. linuxの場合,カーネルからならvirt2phys()等使えますが,ユーザランドからはそのような関数はありません. その代わり, /proc/self/pagemap を参照して解決することが…
前回LAPICについて書きました.LAPICは今ではCPU内に埋め込まれており,IntelのSDMにその使用方法が書いてあります.一方でI/O APICは今ではチップセットに埋め込まれているため,I/O APICに関して知りたい場合はチップセットのデータシートを見ることになり…
kallsymsを見てみると,メモリ先頭のユーザ空間のアドレスにあるシンボルが複数存在していることが確認できます. % sudo cat /proc/kallsyms | head 0000000000000000 A irq_stack_union 0000000000000000 A __per_cpu_start 0000000000004000 A exception_…
実際のデバイスでMSI-Xの設定の確認をしてみます. 今手元にX540があるので,それで実際に確認してみます. 文献 X540の仕様は以下から入手できます. Intel Ethernet Controller X540: Datasheet 7.3章にX540におけるMSI-Xについて書いてあります.また,9.…
MSI (Message Signaled Interrupts) はPCI Technology Specificationが策定した,PCI/PCIeで利用される割り込み方法の一つです.最初から存在したpin-basedな割り込み(INTx割り込み)と比べ,MSIを利用する利点として以下が挙げられます. pin-base割り込み…
APICは今のx86アーキテクチャで使用されている割り込みコントローラのことです.仕様は, Intel SDM 10章 などに書いてあります.以下,図はSDMから引用しています. APICは各コアごとに存在するLocal APICと,外部からの割り込みを担当するI/O APICに分かれ…
Linux Device Driver Chapter 15では Linuxで利用されるアドレスを以下の5種類に分類しています. User virtual address Physical address Bus address Kernel logical address Kenerl virtual address User virtual addressはその名の通りユーザプロセスが…
rustからCの関数を呼ぶ方法(あるいは,その逆)は公式のドキュメント (https://doc.rust-lang.org/book/ffi.html)に書いてあるのでそれを読めばいいんで すが,自分で書いたCの関数を呼ぶ方法について直接は書いてないのでここに簡単に まとめてみます. ru…
intelの以下のページに方法とコードが書いてあります. software.intel.com AVX2等は以下のCPUIDで調べることができます. CPUID.(EAX=01H, ECX=0H):ECX.FMA[bit 12]==1 CPUID.(EAX=07H, ECX=0H):EBX.AVX2[bit 5]==1 CPUID.(EAX=07H, ECX=0H):EBX.BMI1[bit 3…
seccompについて seccompのプログラム 特定のシステムコールのみ許可する libseccomp ここまでのまとめ 参考文献 seccompについて seccomp (Secure Computingの略らしい)は,Linuxにおいてサンドボックスを実現するために プロセスのシステムコールの発行を…
はじめに BPFの基礎 BPFの構造 BPFでのフィルタリング レジスタマシン LinuxでのBPF BPFを利用したパケットフィルタリング libpcapとBPF ここまでのまとめ 参考文献 その他参考URL はじめに BPFはBerkeley Packet Filterの略で,1993年に効率的なパケットフ…
2017-1-7 追記 このページに今でも検索から辿り着く方がいるようなので追記. 以下で説明しているvim-latexですが,Latex-Suiteと名前が被っているということで2015年3月にvimtexに名称が変わりました. github.com それに伴い変数のprefixがg:latex_... = .…