[英]BPF lib documentation
我用 BPF 庫( https://github.com/libbpf/libbpf )創建了一個應用程序。 不幸的是它沒有文檔或者至少我還沒有找到它。 我唯一發現的是這個https://libbpf.readthedocs.io/en/latest/api.html ,但它沒有我需要的一切。
我想知道,這個 function 中的 void *ctx 是做什么用的,這些 ring_buffer_opts 是什么。
LIBBPF_API struct ring_buffer *
ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, const struct ring_buffer_opts *opts);
在這里我想知道什么是 void *ctx 。
typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size);
我更喜歡鏈接到文檔,但我為一切感到高興。
您已找到該項目的 GitHub 鏡像(“原始”源位於 Linux kernel 存儲庫中)和官方 API 文檔。 后者是從源代碼生成的,特別是從src/libbpf.h
中的注釋生成的。 可能是文檔不是最新的,似乎 HTML 呈現的文檔中目前缺少一些功能的描述。
但是,還沒有記錄所有功能,環形緩沖區 API 在這方面沒有太多幫助你。 所以我能建議的最好的方法是查看代碼和現有示例。 kernel 存儲庫中至少有兩個使用ring_buffer__new()
的自測: ringbuf.c
和ringbuf_multi.c
。
第一個( ringbuf.c
)這樣稱呼它:
ringbuf = ring_buffer__new(skel->maps.ringbuf.map_fd,
process_sample, NULL, NULL);
它傳遞一個指向名為process_sample
的 function 的指針作為第二個參數, NULL
作為第三個參數的ctx
,以及NULL
以及選項。
回調 function process_sample
由ring_buffer__poll()
或ring_buffer__consume()
在每個樣本上調用以根據用戶需要“處理”它們。 在此示例中,回調僅適用於樣本中的data
,打印一行內容取決於這是檢索到的第一個樣本還是第二個樣本。 回調不需要“上下文”:這就是為什么ctx
參數,它由ring_buffer__new()
存儲,然后在每次運行時作為第一個參數傳遞給回調 function,在這種情況下是NULL
。
對於第二個示例( ringbuf_multi.c
),我們得到一個ctx
:
ringbuf = ring_buffer__new(bpf_map__fd(skel->maps.ringbuf1),
process_sample, (void *)(long)1, NULL);
[...]
err = ring_buffer__add(ringbuf, bpf_map__fd(skel->maps.ringbuf2),
process_sample, (void *)(long)2);
回調 function 再次命名為process_sample
,但它是不同的(它與示例的 rest 在同一文件中定義)。 我們還傳遞了一個上下文1
,然后我們添加了一個額外的環形緩沖區,具有不同的上下文2
。 如果您查看在其下執行的檢查以及process_sample
的定義方式,它應該可以讓您很好地了解ctx
的工作原理:它是一些通用上下文,您可以將其傳遞給每個單獨的環形緩沖區,以便您可以根據樣品屬於哪個環形緩沖區以不同的方式處理您的樣品。
至於struct ring_buffer_opts *
選項,在示例中總是在NULL
,它們似乎暫時沒有使用。 ring_buffer__new()
中的代碼不使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.