我是伯克利数据包过滤器的新手。我正在尝试学习如何手动滚动我自己的 bpf 代码,然后使用 bpf_asm 编译它。我正在使用内核 4.4.0-137 开发 ubuntu 16.04。我已经下载了源代码,并且正在阅读推荐的阅读材料,Documentation/networking
特别是[filter.txt][1]
. 我使用提供的 makefile安装binutils
、构建和安装bpf_asm
。tools/net
到目前为止,一切似乎都很顺利。当我运行bpf_asm -c bpf_example
程序时,会产生一个标准输出的 ' 标记。我正在尝试编译的代码Documentation/networking/filter.txt
是为了完整起见,我将其包含在此处提供的示例代码。
ld [4] /* offsetof(struct seccomp_data, arch) */
jne #0xc000003e, bad /* AUDIT_ARCH_X86_64 */
ld [0] /* offsetof(struct seccomp_data, nr) */
jeq #15, good /* __NR_rt_sigreturn */
jeq #231, good /* __NR_exit_group */
jeq #60, good /* __NR_exit */
jeq #0, good /* __NR_read */
jeq #1, good /* __NR_write */
jeq #5, good /* __NR_fstat */
jeq #9, good /* __NR_mmap */
jeq #14, good /* __NR_rt_sigprocmask */
jeq #13, good /* __NR_rt_sigaction */
jeq #35, good /* __NR_nanosleep */
bad: ret #0 /* SECCOMP_RET_KILL_THREAD */
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
中提到的输出filter.txt
是
$ ./bpf_asm -c foo
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 1, 0x00000806 },
{ 0x06, 0, 0, 0xffffffff },
{ 0x06, 0, 0, 0000000000 },
但是,我的输出是
./bpf_asm -c bpf_example
'
我显然把事情搞砸了。有人可以指出我忽略了什么,为尝试的事情提供建议,或者提供额外的文献补充filter.txt
吗?谢谢你。
编辑
仔细阅读代码后,我发现 bpf_exp.y 正在调用 yyerror。有一条消息“lex unknown character”,我觉得这有点奇怪,因为我将文本filter.txt
直接从一个新文件中拉出来。使用 bpf_exp.l 我在 for 的产生中发现了一些奇怪的行为.
,它用于捕获任何其他词法分析器未捕获的输出并输出错误。将这些评论出来......这可能是一个糟糕的主意,我能够产生 bpf 输出。但是,它并不等同于filter.txt
建议的输出。但是,它确实包含与输入的 bpf 相同的行数,并且在运行它之后bpf_dbg
程序我恢复了我输入的相同输出。这个程序不再维护了吗?或者我仍然没有正确使用它?此外,输入 bpf 程序似乎很难filter.txt
作为建议的程序输出,因为我不相信解析器对输出代码有任何优化。因此,它似乎需要具有相同数量的行。这是一个正确的假设吗?