<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      eBPF編寫避坑指南

      0x1:基本概念

      1. 當使用tracepoint的時候,函數參數如何確認?

      cat /sys/kernel/debug/tracing/events/syscalls/xxx/format. xxx為要跟蹤的函數,在這里有函數參數定義。

      0x2:注意事項

      1. 寫結構體的時候一定要注意內存對齊,防止被編譯器優化填充。

      2. 使用 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
      
      1. 指針被操作過后,就得再次聲明,不然會被禁止訪問
      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) { //才能正常使用
          // do something
      }
      

      0x3:常見報錯

      1. R2 min value is negative, either use unsigned or 'var &= const'

      第二個變量需要保證非負。 邏輯運算0xFFFFFFFF。

      1. R2 unbounded memory access, use 'var &= const' or 'if (var < const)'
      bpf驗證器有限制 
      
      #define BPF_MAX_VAR_SIZ (1 << 29)
      if (reg->umax_value >= BPF_MAX_VAR_SIZ) {
      	verbose(env, "R%d unbounded memory access, use 'var &= const' or 'if (var < const)'\n",
      		regno);
      	return -EACCES;
      }
      
      1. invalid stack type R1 off=-72 access_size=536870911
      類似的問題,需要進行邏輯運算保證變量的范圍。
      
      off = reg->off + reg->var_off.value;
      if (off >= 0 || off < -MAX_BPF_STACK || off + access_size > 0 ||
          access_size < 0 || (access_size == 0 && !zero_size_allowed)) {
      	verbose(env, "invalid stack type R%d off=%d access_size=%d\n",
      		regno, off, access_size);
      	return -EACCES;
      }
      
      1. 從map中lookup出來的指針,不能直接update回去,在eBPF代碼中更新值之后不再需要重新update,因為拿到了引用.

      2. 字符串拷貝可以使用編譯器內置的 __builtin_memcpy

      3. 一個bpf程序不能申請太多的棧空間,目前限制512Byte,多了就會報錯:Looks like the BPF stack limit of 512 bytes is exceeded.。例如在程序中申請了兩個數組char arr1[256];char arr2[256];程序就會報錯了

      4. 程序包含無法執行到的指令

      unreachable insn 1
      
      1. 程序讀取未初始化的寄存器
      0: (bf) r0 = r2
      R2 !read_ok
      
      1. 程序退出前未設置 R0 寄存器
      0: (bf) r2 = r1
      1: (95) exit
      R0 !read_ok
      
      1. 程序訪問超出棧空間
      0: (7a) *(u64 *)(r10 +8) = 0
      invalid stack off=8 size=8
      
      1. 未初始化棧內元素,就傳遞該棧地址
      0: (bf) r2 = r10
      1: (07) r2 += -8
      2: (b7) r1 = 0x0
      3: (85) call 1
      invalid indirect read from stack off -8+0 size 8
      
      1. 程序未檢查 map_lookup_elem() 的返回值是否為空就開始使用
      0: (7a) *(u64 *)(r10 -8) = 0
      1: (bf) r2 = r10
      2: (07) r2 += -8
      3: (b7) r1 = 0x0
      4: (85) call 1
      5: (7a) *(u64 *)(r0 +0) = 0
      R0 invalid mem access 'map_value_or_null'
      

      本文由博客一文多發平臺 OpenWrite 發布!

      posted @ 2021-12-27 14:13  SenberHu  閱讀(714)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美牲交a欧美牲交aⅴ免费真| 亚洲男人av天堂久久资源| 中文字幕无码精品亚洲35| av午夜福利一片看久久| 浦城县| 波多结野衣一区二区三区| 在线一区二区中文字幕| 无码激情亚洲一区| 99视频在线精品国自产拍| 欧美成人午夜在线观看视频| 免费拍拍拍网站| 麻豆av一区二区三区| 国产情侣激情在线对白| 濮阳县| 视频一区二区不中文字幕| 在线精品视频一区二区三四| 乱老年女人伦免费视频| 黄色一级片一区二区三区| 国产尤物AV尤物在线看| 亚洲av熟女国产一二三| 亚洲av产在线精品亚洲第一站| 国产无遮挡又黄又大又爽 | 国产一区二区三区怡红院| 亚洲一区二区美女av| 日韩少妇内射免费播放| 国精品无码一区二区三区左线| 综合色一色综合久久网| 亚洲欧美日韩国产精品专区| 国产成人精品成人a在线观看| 久久综合亚洲鲁鲁九月天| 又爽又黄又无遮挡的激情视频| 蜜臀视频在线观看一区二区| 日韩精品中文字幕人妻| 另类 专区 欧美 制服| 国产精品一区二区不卡91| 成人午夜视频在线| 夜夜躁日日躁狠狠久久av| 枞阳县| 亚洲国产欧美一区二区好看电影| 久久国产精品老人性| 久国产精品韩国三级视频|