eBPF系列:开发流程
简介
eBPF程序分为用户态程序和内核态程序,其中内核态程序是运行在eBPF虚拟机(内核中)上的;
eBPF内核态程序是需要采用C语言编写,通过BCC编译器,编译成eBPF字节码,然后才能从用户态加载到内核中的
eBPF虚拟机里运行;
eBPF虚拟机就是将eBPF字节码
转换成机器码,以便在主机内核中运行;为了提升运行性能,
eBPF内集成了JIT(及时编译),可以在字节码程序首次运行之前,即时编译成可以在硬件上直接运行的机器码,之后就无需再进行翻译,可以直接运行一直编译好的机器码;
eBPF的用户态程序和内核态程序的数据交互是通过一种eBPF特有的map数据结构来实现的;
eBPF map是位于内核态,采用键值存储模式,可以持久化存储,可以被多个不同BPF程序访问,具有全局性,支持很多不同的数据类型,例如数组,哈希表,队列,栈,环形缓存等;
eBPF内核态程序字节码是通过系统调用bpf操作,加载到内核态的;
eBPF map的数据结构的创建也是通过系统调用bpf来完成的;
用户态程序通过一个整型句柄fd来操作map数据,句柄fd与BPF文件系统是一一对应的,
BPF 文件系统可以将每个map数据映射到文件系统上,方便多个eBPF程序通过文件获取句柄fd,来操作map数据;(不同程序中,同一个map文件对应的fd可能不同,但map id一定是相同的)
开发工具链
目前支持eBPF内核态程