0x1:基本概念
- 当使用tracepoint的时候,函数参数如何确认?
cat /sys/kernel/debug/tracing/events/syscalls/xxx/format. xxx为要跟踪的函数,在这里有函数参数定义。
0x2:注意事项
-
写结构体的时候一定要注意内存对齐,防止被编译器优化填充。
-
使用 LLVM 内置的函数做内存操作
#ifndef memset
# define memset(dest, chr, n) __builtin_memset((dest), (chr), (n))
#endif
#ifndef memcpy
# define memcpy(dest, src, n) __builtin_memcpy((dest), (src), (n))
#endif
#ifndef memmove
# define memmove(dest, src, n) __builtin_memmove((dest), (src), (n))
#endif
- 指针被操作过后,就得再次声明,不然会被禁止访问
struct iphdr *ip4 = (struct iphdr *) skb->data + ETH_HLEN; //第一次赋值
skb_store_bytes(skb, l3_off + offsetof(struct iphdr, saddr), &new_saddr, 4, 0); //skb被操作了 因此ip4的值不可信,此时如果操作ip4会被拒绝
ip4 = (struct iphdr *) skb->data + ETH_HLEN; //再获取一次
if (ip4->protocol == IPPROTO_TCP) {

本文介绍了eBPF的基本概念,包括如何确认tracepoint的函数参数;强调了注意事项,如内存对齐和避免编译器填充,使用LLVM内置函数进行内存操作,以及指针操作后的声明;列举了常见的报错及其解决方法,如处理负值、内存访问、栈空间限制、未初始化的寄存器等问题。

2485

被折叠的 条评论
为什么被折叠?



