购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 架构

内核的BPF架构设计非常精巧。我们将贯穿全书深入探讨BPF具体细节。在本章中,我们将给出BPF工作原理的概览。

如前所述,BPF是一种高级虚拟机,可以在隔离的环境执行代码指令。从某种意义上看,BPF和Java虚拟机(JVM)功能类似,我们可以将高级编程语言编译成机器代码,JVM是一种运行这种机器代码的专用程序。编译器LLVM和GNU GCC(不久的将来)可提供对BPF的支持,将C代码编译成BPF指令。代码编译后,BPF使用BPF验证器来确保程序在内核中安全运行。BPF验证器能阻止可能使内核崩溃的代码。如果代码是安全的,BPF程序将被加载到内核中。Linux内核也为BPF指令集成了即时 (JIT)编译器。在程序被验证后,JIT编译器会直接将BPF字节码转换为机器代码,从而减少运行时的时间开销。该架构具有一个非常有用的特点就是加载BPF程序无须重启系统,我们不仅可以在系统启动时通过初始化脚本加载BPF程序,也可以按需随时加载程序。

在内核运行BPF程序之前,我们需要知道程序附加的执行点。内核中有诸多执行点,数量也在持续增长。程序执行点是由BPF程序类型确定,我们将在第2章讨论它们。当选择了特定的执行点时,内核会提供一些可用的帮助函数,这些帮助函数可用于处理程序接收的数据,从而使执行点和BPF程序能够紧密地配合。

BPF架构中的最后一个组件称作BPF映射,BPF映射负责在内核和用户空间之间共享数据。我们将在第3章中讨论BPF映射。BPF映射提供双向的数据共享,这意味着我们可以分别从内核和用户空间写入和读取数据。BPF映射包括一些数据结构类型,从简单数组、哈希映射到自定义的映射,我们甚至可以将整个BPF程序保存在BPF映射中。

本书将详细地介绍BPF架构的每个组件,你可以学习使用BPF的扩展性以及数据共享机制。同时,本书还会提供一些具体示例,涉及栈跟踪分析、网络过滤和运行时隔离等内容。 Q0aZDwcQGno46df4kFkvi9gVoe/DQUPQnqpLPNyEzI1k2oedmpwlQaoffitVdXcC

点击中间区域
呼出菜单
上一章
目录
下一章
×