1.2 什么是eBPF?(下)
四,eBPF的优势
4.1 eBPF程序的动态加载
eBPF程序可以动态地加载到内核中,或从内核中删除。这个要与内核模块的加载与卸载区分开来。这里顺便讨论下eBPF程序与内核模块的区别,如下:
- 而Linux内核模块是面向内核API编程的,可以直接运行在内核当中。eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。
- eBPF架构更强调安全性和稳定性,eBPF程序只能通过 BPF Helper 函数调用,不能直接调用内核函数。此外eBPF程序在通过加载器加载到内核时,必须通过验证器进行检查,这极大的保障六内核安全。而开发者编写的内核模块,在内核进行加载运行时可以直接调用内核函数,因为没有经过内核维护者的评审发布,风险很高,可能会引入安全漏洞或直接导致内核Panic。
- eBPF可以通过map映射与用户空间的进程进行交互,而内核模块只能通过传统的打印日志或文件节点进行交流,灵活性差。
- 让做过内核Porting的同学很头疼的就是内核模块的移植性差,这一点在eBPF上得到了极大地改善。
加载到内核的eBPF程序一旦被附加到一个事件上,无论是什么导致了该事件的发生,它就会被该事件触发。例如如果你将一个eBPF程序附加到用于打开文件的系统调用上,则只要有其他任何进程试图打开这个文件,它就会被触发。eBPF被加载时,那个进程是否已经运行起来并不重要。
4.2 eBPF程序的高性能
eBPF程序被加载并进行JIT编译后,该程序将作为本机机器指令在CPU上运行。此外,无需承担在内