Daily Study
更新: 5/26/2025 字数: 0 字 时长: 0 分钟
Daily Plan
#todo
eBPF回顾
eBPF
能够在不更改内核代码的前提下,实现实时获取和修改操作系统的操作,是一种安全高效的内核可编程技术,拥有以下特性:
- 安全:
eBPF
程序必须被验证器校验通过后才能执行,且不能包含无法到达的指令;eBPF
程序不能随意调用内核函数,只能调用在API
中定义的辅助函数;eBPF
程序栈空间最多只有 512 字节,想要更大的存储,就必须要借助映射存储。 - 高效:借助即时编译器(JIT),且因为
eBPF
指令依然运行在内核中,无需向用户态复制数据,大大提高了事件处理的效率。
eBPF的架构: 用户态:
- 用户编写
eBPF
程序,可以使用eBPF
汇编或者eBPF
特有的C
语言来编写。 - 使用 LLVM/CLang 编译器,将
eBPF
程序编译成eBPF
字节码。 - 调用
bpf()
系统调用把 eBPF 字节码加载到内核
内核态:
- 当用户调用
bpf()
系统调用把eBPF
字节码加载到内核时,内核先会对eBPF
字节码进行安全验证。 - 使用
JIT(Just In Time)
技术将eBPF
字节编译成本地机器码(Native Code)
。 - 然后根据
eBPF
程序的功能,将eBPF
机器码挂载到内核的不同运行路径上(如用于跟踪内核运行状态的eBPF
程序将会挂载在kprobes
的运行路径上)。当内核运行到这些路径时,就会触发执行相应路径上的eBPF
机器码。
根据挂载点的功能,分为几个模块:
- 性能跟踪
- 网络优化
- 容器
- 安全
未完待续