我是Berkeley Packet Filter的新手。我正在尝试学习如何手动编写自己的bpf代码,然后使用bpf_asm对其进行编译。我正在使用内核4.4.0-137在ubuntu 16.04上工作。我已经下载了源代码,并且正在按照建议的阅读方式Documentation/networking
(尤其是[filter.txt][1]
)进行工作。我已经安装了binutils
,并使用提供的Makefile构建并安装了位于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未知字符”,由于我将文本从filter.txt
直接拉到一个新文件中,因此我感到有些奇怪。在玩bpf_exp.l时,我在.
的生产中发现了一些奇怪的行为,该行为用于捕获其他词法分析器未捕获的任何输出并输出错误。评论那些...这可能是一个糟糕的主意,我能够产生bpf输出。但是,它不等同于filter.txt
作为输出的建议。但是,它确实包含与输入的bpf相同的行数,并且在通过bpf_dbg
程序运行它之后,我恢复了与输入相同的输出。该程序不再维护吗?还是我仍然没有正确使用它?此外,将filter.txt
中的输入bpf程序作为建议的程序输出似乎非常困难,因为我不认为解析器对输出代码有任何优化。因此,似乎它需要具有相同数量的行。这是正确的假设吗?