This commit is contained in:
yunwei37
2024-01-26 22:25:31 +00:00
parent 641be45c8b
commit ed81c8d29d
3 changed files with 8 additions and 8 deletions

View File

@@ -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: &quot;/root/.bpftime/libbpftime-agent.so&quot;
<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>