mirror of
https://github.com/eunomia-bpf/bpf-developer-tutorial.git
synced 2026-02-04 02:34:16 +08:00
Deploying to gh-pages from @ eunomia-bpf/bpf-developer-tutorial@714af6a3b0 🚀
This commit is contained in:
@@ -731,7 +731,7 @@ Runing eBPF program...
|
||||
<h2 id="什么是uprobe"><a class="header" href="#什么是uprobe">什么是uprobe</a></h2>
|
||||
<p>uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。</p>
|
||||
<p>uprobe基于文件,当一个二进制文件中的一个函数被跟踪时,所有使用到这个文件的进程都会被插桩,包括那些尚未启动的进程,这样就可以在全系统范围内跟踪系统调用。</p>
|
||||
<p>uprobe适用于在用户态去解析一些内核态探针无法解析的流量,例如http2流量(报文header被编码,内核无法解码),https流量(加密流量,内核无法解密)。具体可以参考 <a href="5-uprobe-bashreadline/../30-sslsniff">eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据</a> 中的例子。</p>
|
||||
<p>uprobe适用于在用户态去解析一些内核态探针无法解析的流量,例如http2流量(报文header被编码,内核无法解码),https流量(加密流量,内核无法解密)。具体可以参考 <a href="5-uprobe-bashreadline/../30-sslsniff/README.html">eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据</a> 中的例子。</p>
|
||||
<p>Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 <a href="https://github.com/eunomia-bpf/bpftime">bpftime</a>。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。</p>
|
||||
<h2 id="使用-uprobe-捕获-bash-的-readline-函数调用"><a class="header" href="#使用-uprobe-捕获-bash-的-readline-函数调用">使用 uprobe 捕获 bash 的 readline 函数调用</a></h2>
|
||||
<p>uprobe 是一种用于捕获用户空间函数调用的 eBPF 的探针,我们可以通过它来捕获用户空间程序调用的系统函数。</p>
|
||||
@@ -7498,9 +7498,9 @@ Inject: "/root/.bpftime/libbpftime-agent.so"
|
||||
<p>Uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。</p>
|
||||
<p>uprobe 适用于在用户态去解析一些内核态探针无法解析的流量,例如 http2 流量,https 流量,同时也可以分析程序运行时、业务逻辑等。关于 Uprobe 的更多信息,可以参考:</p>
|
||||
<ul>
|
||||
<li><a href="37-uprobe-rust/../30-sslsniff">eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据</a></li>
|
||||
<li><a href="37-uprobe-rust/../31-goroutine">eBPF 实践教程:使用 uprobe 捕获 Golang 的协程切换</a></li>
|
||||
<li><a href="37-uprobe-rust/../32-http2">eBPF 实践教程:使用 uprobe 捕获用户态 http2 流量</a></li>
|
||||
<li><a href="37-uprobe-rust/../30-sslsniff/README.html">eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据</a></li>
|
||||
<li><a href="37-uprobe-rust/../31-goroutine/README.html">eBPF 实践教程:使用 uprobe 捕获 Golang 的协程切换</a></li>
|
||||
<li><a href="37-uprobe-rust/../32-http2/README.html">eBPF 实践教程:使用 uprobe 捕获用户态 http2 流量</a></li>
|
||||
</ul>
|
||||
<p>Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 <a href="https://github.com/eunomia-bpf/bpftime">bpftime</a>。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF Uprobe 程序,和内核态的 eBPF 兼容,由于避免了内核态和用户态之间的上下文切换,bpftime 的 Uprobe 开销比内核少约 10 倍,并且也更容易扩展。</p>
|
||||
<h2 id="rust"><a class="header" href="#rust">Rust</a></h2>
|
||||
|
||||
Reference in New Issue
Block a user