本文转自http://eslxf.blog.51cto.com/918801/278879
1.1.1. BPF系统架构图
图10-5 BPF的系统架构图
一个用高层语言表示的过滤器,被编译与优化成
BPF
虚拟机中间字节码
(VM Byte Codes)
。字节码接着经过保护边界,检查代码的合法性,接着在线解释或汇编代码为本地机器码。
BPF
系统包含了下列组件,把
用高层语言表示的过滤器转换为底层可执行的数据包过滤器。
Ø
前端输入是一个高层语言的过滤器表达式,基于被最初
libpcap
与
tcpdump
使用的公开的谓词语法。
Ø
BPF
编译器把该谓词表达式转换为一个命令,用一个
SSA
中间
形式表示的
控制流程图。
Ø
SSA
中间
形式通过代码优化器执行全局的与局部的数据流优化。优化器的输出为一个与BPF虚拟机模型一致的字节码。
Ø
BPF
字节码接着被传递到一个可执行的环境中,比如穿过用户层—内核层的边界去执行用户定义的协议分析。
Ø
一当进入目标保护区域,安全确认机制就认为该字节码是可信的。
Ø
最后,一个
“just in time” (JIT)
编译器
把优化过的并通过安全检查的字节码汇编成本地机器码,并执行可选的与机器相关的优化。如果目标环境中是一个解释器而不是一个本地硬件,比如在
BPF
内核执行,其解释执行过滤器的字节代码,那么最后一步将被省略。
但是,
WinPcap
的
NPF
不解释过滤器,而是执行它们。为了性能的原因,在使用过滤器之前,
NPF
把它给
JIT
编译器,该编译器把它转换成一个本地
80X86
的函数。
当一个数据包被捕获后,
NPF
调用该本地函数,而不是调用该过滤器的解释器,这使得过滤处理很快。