タグ

ブックマーク / mmi.hatenablog.com (8)

  • cBPFプログラムをLLVM IRに変換する - 睡分不足

    最近Linuxでいろいろと大活躍のBPF (Berkeley Packet Filter)には主に2種類あって,一番最初に提唱されlibpcapなどで利用されるcBPF (classic BPF)と,主にLinux内で現在利用されている,cBPFをベースに拡張したeBPF (extended BPF)があります. cBPFのプログラムはlibpcapを使ってtcpdumpなどで使われるフィルタ式からコンパイルすることが可能です.一方eBPFはllvmのバックエンドでサポートされているためclangを使ってC言語からコンパイルすることが可能です. Linuxはカーネル内にcBPFプログラムをeBPFプログラムに変換する機構を持っていて,cBPFプログラムを使う場合は内部的にeBPFに変換されて実行されています. これによりlibpcapでコンパイルしたcBPFプログラムはLinux内で使うこ

    cBPFプログラムをLLVM IRに変換する - 睡分不足
    udzura
    udzura 2022/05/18
  • Rustのasync/awaitを使ったecho serverの実装 - 睡分不足

    rust 1.39でasync/await構文が安定化されます. 巷で話題の機能ですが,asycn/await何も分からん...ということで話題に乗り遅れないためにasync/awaitを利用してecho serverを実装してみます. OSはLinuxが対象です.ソースはここにあります. echo server async/awaitを使用する前に,まずは通常のecho serverを作成してみます(ソース). あえてstd::netを使わないで実装しています. 主処理は以下のようになっています. fn handle_client(stream: TcpStream) -> io::Result<()> { let mut buf = [0u8; 1024]; loop { let n = syscall!(read( stream.0, buf.as_mut_ptr() as *mut

    Rustのasync/awaitを使ったecho serverの実装 - 睡分不足
    udzura
    udzura 2021/03/14
  • rustで動的にバッファを確保する方法 - 睡分不足

    Boxを使う Vecを使う std::heap::Allocを使う placement-in を使う mallocを使う 1. Boxを使う rustで動的にメモリを確保する方法といってまず思いつくのはBoxを使う方法だと思います.例えば,以下のようにすれば長さ1000のu8のバッファを確保できます. let buffer : Box<[u8]> = Box::new([0;1000]); ただし,この方法は以下のような特徴があります. 確保した領域は必ず初期化する必要がある. 一旦スタック上にデータを確保したあとに,ヒープにそのデータをコピーする 1.に関しては,これは変数は初期化しないと利用できないというrustの原則に則ったものですが,場合によってはこの初期化コストが大きい場合があります.また,2. の方が問題で,あまりにも大きい領域を確保しようとするとスタックオーバフローが発生する

    rustで動的にバッファを確保する方法 - 睡分不足
    udzura
    udzura 2021/02/20
  • rustでCで書いた関数を呼ぶ / Cからrustで書いた関数を呼ぶ - 睡分不足

    rustからCの関数を呼ぶ方法(あるいは,その逆)は公式のドキュメント (https://doc.rust-lang.org/book/ffi.html)に書いてあるのでそれを読めばいいんで すが,自分で書いたCの関数を呼ぶ方法について直接は書いてないのでここに簡単に まとめてみます. rustでCで書いた関数を呼ぶ 以下のCで書いた関数をrustから呼ぶことを考えます. foo.c #include<stdio.h> void foo(){ printf("foo!!\n"); } rustから以下のようにして関数の呼び出しをおこないます. main.rs #[link(name="foo", kind="static")] extern{ fn foo(); } fn main() { unsafe {foo();}; } #[link(name="foo", kind="static

    rustでCで書いた関数を呼ぶ / Cからrustで書いた関数を呼ぶ - 睡分不足
    udzura
    udzura 2020/12/27
    シンプル
  • bpftrace 2020 - 睡分不足

    (この記事はLinux Advent Calendar 2020 - Qiitaの2日目の記事です.前日はmasami256さんのTiny Core LinuxLinuxのinitプロセスが実行されるあたりを調べるでした.) みなさんこんにちはこんばんは.bpftraceを使っていますか? (e)BPFといえば最近は専らCiliumなどネットワークが話題ですが,bpftraceはBPF*1を利用したトレーシングツールです.私は昨年からぼちぼち使い始めて,機能追加やバグ修正のパッチをいろいろと投げていた(130+)ら気づいたらコミッタになっていました.ということでbpftraceについては比較的よく知っていると思うので,今年にbpftraceに追加された主要な機能や変更点を紹介したいと思います. bpftrace知らないなぁという方はこちら(拙文です)を,bpftrace使ってないなぁとい

    bpftrace 2020 - 睡分不足
    udzura
    udzura 2020/12/03
    “日本語版ドキュメント”
  • perf, ftraceのしくみ - 睡分不足

    Linuxのトレーサーであるperfやftraceのツールの使い方に関する情報は結構ありますが,構造に関してはあまり見つけられなかったため,ここに簡単に調べたことをまとめようかと思います.(ツールの使い方の説明はあんまりしないです.) この文章はLinux 4.15のソースに基づいています. 全体像 ftrace function trace tracepoint (static event) kprobe (dynamic event) その他のtracer trace-cmd perf PERF_TYPE_HARDWARE, HW_CACHE, RAW PERF_TYPE_SOFTWARE PERF_TYPE_TRACEPOINT PERF_TYPE_BREAKPOINT USDT (SDT Event) perf-tools perf ftrace straceとの比較 その他 pe

    perf, ftraceのしくみ - 睡分不足
    udzura
    udzura 2018/04/09
    情報だ
  • LinuxのBPF : (2) seccompでの利用 - 睡分不足

    seccompについて seccompのプログラム 特定のシステムコールのみ許可する libseccomp ここまでのまとめ 参考文献 seccompについて seccomp (Secure Computingの略らしい)は,Linuxにおいてサンドボックスを実現するために プロセスのシステムコールの発行を制限する機能です. seccompを使っている代表的なアプリケーションにはchromeやOpen SSHなどがあります.最近利用が増えてきているようです. seccompはLinux 2.6.12 (2005)から導入されました. このときseccompは/proc/pid/seccompを1にするとread(),write(),exit(),sigreturn()のみを許可し, それ以外のシステムコールを呼ぶとSIGKILLするというものでした. その後,もう少し柔軟にシステムコールを

    LinuxのBPF : (2) seccompでの利用 - 睡分不足
    udzura
    udzura 2016/11/15
    seccomp入門
  • LinuxのBPF : (1) パケットフィルタ - 睡分不足

    はじめに BPFの基礎 BPFの構造 BPFでのフィルタリング レジスタマシン LinuxでのBPF BPFを利用したパケットフィルタリング libpcapとBPF ここまでのまとめ 参考文献 その他参考URL はじめに BPFはBerkeley Packet Filterの略で,1993年に効率的なパケットフィルタリング手法として提案されました[1] *1. BPFの構成要素は大きく2つあって,一つがネットワークからパケットをキャプチャする部分,そしてもう一つがキャプチャした パケットをフィルタリングする部分です.BPFといった場合,後者のフィルタリング機構だけを指すことも多いです. FreeBSDなどのBSD系のOSでは/dev/bpf*という特別なデバイスがあって,このBPFを利用することができます.また, Linuxでもパケットフィルタリング(Linux Sokcet Filter

    LinuxのBPF : (1) パケットフィルタ - 睡分不足
  • 1