最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例

 更新時(shí)間:2023年12月27日 08:47:46   作者:a朋  
這篇文章主要為大家介紹了libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

libbpf-bootstrap中Rust example

libbpf-bootstrap中包含Rust example,存放在examples/rust/目錄。

以examples/rust/tracecon為例,看一下libbpf和Rust開發(fā)ebpf的開發(fā)和運(yùn)行流程:

  • tracecon程序監(jiān)聽<tcp建立連接>的系統(tǒng)調(diào)用,并記錄其ip或hostname;
  • 內(nèi)核態(tài)的ebpf程序tracecon.bpf.c,使用c語(yǔ)言編寫;
  • 在build.rs中,使用libbpf-cargo這個(gè)依賴庫(kù),構(gòu)建tracecon.bpf.c并生成tracecon.skel.rs;

    • Cargo build會(huì)運(yùn)行builds.rs中的代碼;
  • 在main.rs中,調(diào)用生成的tracecon.skel.rs中的函數(shù),加載并運(yùn)行ebpf程序;

內(nèi)核態(tài)ebpf程序tracecon.bpf.c

ebpf程序監(jiān)聽了kprobe的函數(shù)tcp_v4_connect,從struct sock結(jié)構(gòu)中讀出ip:

// tracecon.bpf.c
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>
#include <bpf/bpf_tracing.h>
…
SEC("kprobe/tcp_v4_connect")
int BPF_KPROBE(tcp_v4_connect_enter, struct sock *sk, struct sockaddr *uaddr, int addr_len)
{
    u32 tid = get_tid();
    if (!tid)
        return 0;
    bpf_map_update_elem(&sockets, &tid, &sk, 0);
    return 0;
};
SEC("kretprobe/tcp_v4_connect")
int BPF_KRETPROBE(tcp_v4_connect_exit, int ret)
{
    u32 tid = get_tid();
    struct sock **sockpp;
    struct lookup *lookup;
    struct event event = {};
    u32 ip;
    if (!tid)
        return 0;
    if (ret != 0)
        goto cleanup;
    sockpp = bpf_map_lookup_elem(&sockets, &tid);
    if (!sockpp)
        return 0;
    ip = BPF_CORE_READ(*sockpp, __sk_common.skc_daddr);    // 讀出ip
    lookup = bpf_map_lookup_elem(&hostnames, &ip);        // 查找hostname
    if (!lookup) {
        event.tag = IP;
        memcpy(&event.ip, &ip, sizeof(event.ip));
    } else {
        event.tag = HOSTNAME;
        memcpy(&event.hostname, &lookup->c, sizeof(lookup->c));
        bpf_map_delete_elem(&hostnames, &ip);
    }
    /* ctx is implied in the signature macro */
    bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
cleanup:
    bpf_map_delete_elem(&sockets, &tid);
    return 0;
}
...

記錄連接事件的event結(jié)構(gòu)定義:

// tracecon.bpf.c
struct event {
    u8 tag;
    u8 ip[4];
    u8 hostname[HOSTNAME_LEN];
};

build.rs

build.rs中,使用libbpf_cargo::SkeletonBuilder,構(gòu)建traceconn.bpf.c并生成tracecon.skel.rs文件:

// build.rs
use libbpf_cargo::SkeletonBuilder;
const SRC: &str = "./src/bpf/tracecon.bpf.c";
fn main() {
    create_dir_all("./src/bpf/.output").unwrap();
    let skel = Path::new("./src/bpf/.output/tracecon.skel.rs");
    SkeletonBuilder::new()
        .source(SRC)
        .build_and_generate(&skel)
        .expect("bpf compilation failed");
    println!("cargo:rerun-if-changed={}", SRC);
}

為此,Cargo.toml中引入了libbpf_cargo這個(gè)crate的依賴:

// Cargo.toml
...
[build-dependencies]
libbpf-cargo = "0.13"

用戶態(tài)程序main.rs

  • 首先,使用tracecon.skel.rs中的TraceconSkelBuilder構(gòu)造skel對(duì)象;
  • 然后,使用skel對(duì)象加載并連接kprobe程序;
  • 最后,使用perf讀取ebpf中的map數(shù)據(jù);
fn main() -> Result<()> {
    ...
    // 使用skel.rs中的TraceconSkelBuilder對(duì)象構(gòu)造skel
    let mut skel_builder = TraceconSkelBuilder::default();
    let mut open_skel = skel_builder.open()?;
    let mut skel = open_skel.load()?;
    // 加載并運(yùn)行
    let _kprobe = skel
        .progs_mut()
        .tcp_v4_connect_enter()
        .attach_kprobe(false, "tcp_v4_connect")?;
    let _kretprobe = skel
        .progs_mut()
        .tcp_v4_connect_exit()
        .attach_kprobe(true, "tcp_v4_connect")?;
    // 使用perf讀events
    let perf = PerfBufferBuilder::new(skel.maps_mut().events())
        .sample_cb(handle_event)
        .build()?;
    while running.load(Ordering::SeqCst) {
        perf.poll(Duration::from_millis(100))?;
    }
    ...
}

具體事件信息的顯示,在handle_event()函數(shù)中:

fn handle_event(_cpu: i32, data: &[u8]) {
    let mut event = Event::default();
    plain::copy_from_bytes(&mut event, data).expect("Event data buffer was too short");
    match event.tag {
        0 => println!("ip event: {}", Ipv4Addr::from(event.ip)),
        1 => println!("host event: {}", String::from_utf8_lossy(&event.hostname)),
        _ => {}
    }
}

運(yùn)行

# cargo run

運(yùn)行后輸出:

host event: connectivity-check.ubuntu.com.
ip event: 202.96.209.133
ip event: 202.96.209.133
...

以上就是libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例的詳細(xì)內(nèi)容,更多關(guān)于libbpf Rust開發(fā)ebpf的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Rust并發(fā)之異步編程應(yīng)用教程

    Rust并發(fā)之異步編程應(yīng)用教程

    這篇文章主要介紹了Rust并發(fā)之異步編程應(yīng)用教程,Rust的異步編程是一種強(qiáng)大的并發(fā)編程范式,它允許我們編寫高效、響應(yīng)迅速的應(yīng)用程序,通過(guò)掌握異步編程的高級(jí)應(yīng)用,我們可以充分利用系統(tǒng)資源,提高應(yīng)用程序的性能,需要的朋友可以參考下
    2026-05-05
  • 探索Rust切片與Go有何區(qū)別

    探索Rust切片與Go有何區(qū)別

    這篇文章主要為大家介紹了Rust切片與Go的區(qū)別探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Rust使用Trait對(duì)象實(shí)現(xiàn)多態(tài)的詳細(xì)步驟

    Rust使用Trait對(duì)象實(shí)現(xiàn)多態(tài)的詳細(xì)步驟

    本文詳細(xì)介紹了在Rust中使用Trait對(duì)象實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)的方法,通過(guò)一個(gè)圖形渲染系統(tǒng)的案例展示了如何統(tǒng)一管理不同類型的圖形對(duì)象,文章涵蓋了Trait對(duì)象的核心概念、語(yǔ)法、性能考量以及在實(shí)際項(xiàng)目中的應(yīng)用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Rust 語(yǔ)言中的dyn 關(guān)鍵字及用途解析

    Rust 語(yǔ)言中的dyn 關(guān)鍵字及用途解析

    在Rust中,"dyn"關(guān)鍵字用于表示動(dòng)態(tài)分發(fā)(dynamic dispatch),它通常與trait對(duì)象一起使用,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài), 在Rust中,多態(tài)是通過(guò)trait和impl來(lái)實(shí)現(xiàn)的,這篇文章主要介紹了Rust 語(yǔ)言中的 dyn 關(guān)鍵字,需要的朋友可以參考下
    2024-03-03
  • Rust常用特型之Drop特型

    Rust常用特型之Drop特型

    本文主要介紹了Rust常用特型之Drop特型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Rust常用特型之ToOwned特型示例詳解

    Rust常用特型之ToOwned特型示例詳解

    在Rust中,假定某類型實(shí)現(xiàn)了Clone特型,如果給你一個(gè)對(duì)它引用,那我們得到它指向內(nèi)容的備份的最常見方式是調(diào)用其clone()函數(shù),這篇文章主要介紹了Rust常用特型之ToOwned特型,需要的朋友可以參考下
    2024-04-04
  • 使用Rust制作康威生命游戲的實(shí)現(xiàn)代碼

    使用Rust制作康威生命游戲的實(shí)現(xiàn)代碼

    這篇文章主要介紹了使用Rust制作康威生命游戲,初始rust項(xiàng)目,使用wasm的項(xiàng)目模板,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Rust安裝與環(huán)境配置超詳細(xì)教程(零基礎(chǔ))

    Rust安裝與環(huán)境配置超詳細(xì)教程(零基礎(chǔ))

    Rust是一門系統(tǒng)編程語(yǔ)言,專注于安全,尤其是并發(fā)安全,支持函數(shù)式和命令式以及泛型等編程范式的多范式語(yǔ)言,這篇文章主要介紹了Rust安裝與環(huán)境配置超詳細(xì)教程的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • Tauri?打開本地文件踩坑分析解決

    Tauri?打開本地文件踩坑分析解決

    這篇文章主要為大家介紹了Tauri?打開本地文件踩坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

望都县| 宿松县| 岚皋县| 彰武县| 金华市| 汤原县| 桦南县| 锡林郭勒盟| 台州市| 葫芦岛市| 齐齐哈尔市| 天峨县| 浦北县| 惠水县| 衡阳县| 东海县| 峨边| 新源县| 始兴县| 招远市| 聊城市| 盘山县| 会东县| 泗阳县| 白银市| 洛宁县| 秀山| 岳阳市| 科尔| 应城市| 静乐县| 东兰县| 孝义市| 利川市| 贺兰县| 蒙阴县| 甘肃省| 洮南市| 察隅县| 固始县| 彭山县|