一、目的
在jetson agx orin上构建内核编译环境(便于实时修改和测试),同时以源码形式编译安装bcc-tools工具,使用bcc-tools工具中BPF应用实例调试orin。
二、硬件配置

三、agx orin的BPF配置
3.1 默认的BPF配置

| 配置项 | 是否启用 | 功能说明 |
|---|---|---|
CONFIG_CGROUP_BPF | 未启用(n) | 控制是否允许在 cgroup(控制组)上附加 BPF 程序,用于对 cgroup 内的进程进行资源管控、行为监控等。未启用则无法通过 BPF 扩展 cgroup 功能。 |
CONFIG_BPF | 启用(y) | 启用 BPF 基础设施的核心支持,是所有 BPF 功能的基础。该选项开启后,内核才能识别和处理 BPF 字节码。 |
CONFIG_BPF_SYSCALL | 启用(y) | 启用 BPF 系统调用(bpf()),允许用户空间程序通过系统调用与内核交互(如加载、验证、附着 BPF 程序,操作 BPF 映射等),是用户态使用 BPF 功能的核心入口。 |
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT | 启用(y) | 表示当前架构(如 ARM、x86 等)倾向于默认启用 BPF JIT 编译器(将 BPF 字节码编译为机器码以加速执行),是架构层面的偏好设置。 |
CONFIG_BPF_JIT_ALWAYS_ON | 未启用(n) | 控制是否强制始终启用 BPF JIT 编译器。未启用时,JIT 可能根据系统配置或场景动态开关(而非强制启用)。 |
CONFIG_BPF_JIT_DEFAULT_ON | 启用(y) | 设置系统默认启用 BPF JIT 编译器,启动时自动使用 JIT 加速 BPF 程序执行(而非解释执行),提升 BPF 程序运行效率。 |
CONFIG_BPF_UNPRIV_DEFAULT_OFF | 未启用(n) | 控制非特权用户(无 CAP_BPF 权限)是否默认允许使用 BPF 功能。未启用时,非特权用户可能默认拥有部分 BPF 使用权限(受内核其他安全策略限制)。 |
CONFIG_BPF_PRELOAD | 未启用(n) | 启用 BPF 程序预加载功能,允许系统启动时自动加载预设的 BPF 程序(如基础监控、安全策略程序)。未启用则无预加载机制。 |
CONFIG_NETFILTER_XT_MATCH_BPF | 未启用(n) | 启用 Netfilter 框架中基于 BPF 的匹配模块,允许在防火墙规则(如 iptables)中使用 BPF 程序作为匹配条件(如过滤特定特征的数据包)。未启用则无法在 Netfilter 中用 BPF 做匹配。 |
CONFIG_BPFILTER | 未启用(n) | 启用 BPFILTER 框架,这是一个基于 BPF 的网络过滤框架,可替代部分传统 Netfilter 功能(如数据包过滤、NAT 等)。未启用则不使用该框架。 |
CONFIG_NET_CLS_BPF | 未启用(n) | 启用流量控制(TC)子系统中基于 BPF 的分类器,允许用 BPF 程序对网络流量进行分类(如按端口、协议、应用标识流量)。未启用则 TC 无法使用 BPF 分类逻辑。 |
CONFIG_NET_ACT_BPF | 未启用(n) | 启用流量控制(TC)子系统中基于 BPF 的动作器,允许用 BPF 程序定义对网络流量的处理动作(如限速、转发、丢弃)。未启用则 TC 无法使用 BPF 动作逻辑。 |
CONFIG_BPF_JIT | 启用(y) | 明确启用 BPF JIT 编译器,将 BPF 字节码编译为机器码,大幅提升 BPF 程序的执行效率(相比解释执行),是高性能 BPF 应用的基础。 |
CONFIG_HAVE_EBPF_JIT | 启用(y) | 标识当前架构(如 Jetson 的 ARM 架构)支持 eBPF JIT 编译器,是架构层面对 JIT 功能的硬件 / 指令集支持声明,为CONFIG_BPF_JIT提供基础。 |
3.2 配置启用BPF
打开如下两个配置
# CONFIG_NET_CLS_BPF is not set
# CONFIG_NET_ACT_BPF is not set
3.2.1 方式1


3.2.2 方式2
vim .config
将“# CONFIG_NET_ACT_BPF is not set”改为“CONFIG_NET_ACT_BPF=y”
将“# CONFIG_NET_CLS_BPF is not set”改为“CONFIG_NET_CLS_BPF=y”


四、目标机编译内核
sudo apt-get update
sudo apt-get install build-essential bc git libncurses5-dev bison flex libssl-dev
wget https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v4.1/sources/public_sources.tbz2
tar -xvf public_sources.tbz2
cd Linux_for_Tegra/source/public/
tar -xvf kernel_src.tbz2
cd kernel
zcat /proc/config.gz > .config
cp .config kernel-5.10/
cd kernel-5.10
make menuconfig
cp .config .config.modified
export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu-
make -j$(nproc) Image make -j$(nproc) modules make -j$(nproc) dtbs
make modules_install #cp -r ../kernel_modules/lib/modules/$(uname -r)/kernel /lib/modules/$(uname -r)/

cp arch/arm64/boot/Image /boot/Image
cp arch/arm64/boot/dts/*.dtb /boot/
reboot
验证BPF部分选项是否开启成功:

五、源码形式安装bcc-tools
BCC安装教程:
https://github.com/iovisor/bcc/blob/master/INSTALL.md
默认使用“sudo apt-get install bpfcc-tools linux-headers-$(uname -r)”命令安装,但是没有linux-headers-5.10.120对应版本,需要使用源码安装。
第一步:安装依赖项
pip3 install --upgrade setuptools

sudo apt install -y zip bison build-essential cmake flex git libedit-dev \ libllvm12 llvm-12-dev libclang-12-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \ liblzma-dev arping netperf iperf
第二步:下载bcc-tools源码并编译
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
root@tegra-ubuntu:/nvidia/bcc/build# cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Submodule 'libbpf-tools/blazesym' (https://github.com/libbpf/blazesym) registered for path 'libbpf-tools/blazesym'
Cloning into '/nvidia/bcc/libbpf-tools/blazesym'...
Submodule path 'libbpf-tools/blazesym': checked out 'd954f73867527dc75025802160c759d0b6a0641f'
Submodule 'libbpf-tools/bpftool' (https://github.com/libbpf/bpftool) registered for path 'libbpf-tools/bpftool'
Submodule 'src/cc/libbpf' (https://github.com/libbpf/libbpf.git) registered for path 'src/cc/libbpf'
Cloning into '/nvidia/bcc/libbpf-tools/bpftool'...
Cloning into '/nvidia/bcc/src/cc/libbpf'...
Submodule path 'libbpf-tools/bpftool': checked out '6eb3e20583da834da18ea3011dcefd08b3493f8d'
Submodule 'libbpf' (https://github.com/libbpf/libbpf.git) registered for path 'libbpf-tools/bpftool/libbpf'
Cloning into '/nvidia/bcc/libbpf-tools/bpftool/libbpf'...
Submodule path 'libbpf-tools/bpftool/libbpf': checked out '7984737fbf3b2a14a86321387bb62abb16cfc4ed'
Submodule path 'src/cc/libbpf': checked out '02bdeb7a2c2e7cb2c9cecb125527a9c5a6bbf139'
-- Latest recognized Git tag is v0.35.0
-- Git HEAD is f55a2f67e05d7cea44f3d850000fd6123caeeda0
-- Revision is 0.35.0+f55a2f67 (major 0, minor 35, patch 0)
-- Performing Test HAVE_NO_PIE_FLAG
-- Performing Test HAVE_NO_PIE_FLAG - Success
-- Performing Test HAVE_REALLOCARRAY_SUPPORT
-- Performing Test HAVE_REALLOCARRAY_SUPPORT - Success
-- Kernel release: 5.10.120
-- Kernel headers: KERNELHEADERS_DIR-NOTFOUND
-- Found ZLIB: /usr/lib/aarch64-linux-gnu/libz.so (found version "1.2.11")
-- Found LLVM: /usr/lib/llvm-12/include 12.0.0 (Use LLVM_ROOT envronment variable for another version of LLVM)
-- Found BISON: /usr/bin/bison (found version "3.5.1")
-- Found FLEX: /usr/bin/flex (found version "2.6.4")
-- Found LibElf: /usr/lib/aarch64-linux-gnu/libelf.so
-- Performing Test ELF_GETSHDRSTRNDX
-- Performing Test ELF_GETSHDRSTRNDX - Success
-- Could NOT find LibDebuginfod (missing: LIBDEBUGINFOD_LIBRARIES LIBDEBUGINFOD_INCLUDE_DIRS)
-- Found LibLzma: /usr/lib/aarch64-linux-gnu/liblzma.so
-- Using static-libstdc++
-- Could NOT find LuaJIT (missing: LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR)
-- Configuring done
-- Generating done
-- Build files have been written to: /nvidia/bcc/build
root@tegra-ubuntu:/nvidia/bcc/build# make
root@tegra-ubuntu:/nvidia/bcc/build# make install
root@tegra-ubuntu:/nvidia/bcc/build# cmake -DPYTHON_CMD=python3 ..
-- Latest recognized Git tag is v0.35.0
-- Git HEAD is f55a2f67e05d7cea44f3d850000fd6123caeeda0
-- Revision is 0.35.0+f55a2f67 (major 0, minor 35, patch 0)
-- Kernel release: 5.10.120
-- Kernel headers: KERNELHEADERS_DIR-NOTFOUND
-- Found LLVM: /usr/lib/llvm-12/include 12.0.0 (Use LLVM_ROOT envronment variable for another version of LLVM)
-- Could NOT find LibDebuginfod (missing: LIBDEBUGINFOD_LIBRARIES LIBDEBUGINFOD_INCLUDE_DIRS)
-- Using static-libstdc++
-- Could NOT find LuaJIT (missing: LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR)
-- Configuring done
-- Generating done
-- Build files have been written to: /nvidia/bcc/build
root@tegra-ubuntu:/nvidia/bcc/build# pushd src/python/
/nvidia/bcc/build/src/python /nvidia/bcc/build
root@tegra-ubuntu:/nvidia/bcc/build/src/python# make
Built target bcc_py_python3
root@tegra-ubuntu:/nvidia/bcc/build/src/python# make installBuilt target bcc_py_python3
Install the project...
-- Install configuration: "Release"
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --helperror: option --install-layout not recognized
上述报错解决:
执行:export SETUPTOOLS_USE_DISTUTILS=stdlib
说明:
distutils是 Python 标准库中用于构建、打包和安装 Python 模块的基础工具;- 较新的
setuptools版本(约 49.0.0+ 之后)默认使用自己内置的distutils替代方案(而非标准库中的版本),以解决旧版distutils的一些缺陷;- 但在某些场景下(例如安装旧版 Python 包、或依赖
distutils标准库行为的脚本),setuptools自带的distutils可能与目标包存在兼容性问题,导致安装报错(如语法错误、功能缺失)。通过
export SETUPTOOLS_USE_DISTUTILS=stdlib,可以强制setuptools回退到使用 Python 标准库原生的distutils,从而规避因setuptools内置版本导致的兼容性问题。root@tegra-ubuntu:/nvidia/bcc/build/src/python# make install
第三步:测试安装情况
# python3
Python 3.8.10 (default, Mar 18 2025, 20:04:55)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from bcc import BPF
>>>
六、bcc-tools的案例
/usr/share/bcc/examples/或/nvidia/bcc/examples/
1023

被折叠的 条评论
为什么被折叠?



