BPF แƒ“แƒ eBPF-แƒ˜แƒก แƒ›แƒแƒ™แƒšแƒ” แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜

แƒฐแƒ”แƒ˜ แƒฐแƒแƒ‘แƒ ! แƒ’แƒแƒชแƒœแƒแƒ‘แƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒ•แƒ”แƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒฌแƒ˜แƒ’แƒœแƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒชแƒ”แƒ›แƒแƒ“"Linux-แƒ˜แƒก แƒ“แƒแƒ™แƒ•แƒ˜แƒ แƒ•แƒ”แƒ‘แƒ BPF-แƒ˜แƒ—".

BPF แƒ“แƒ eBPF-แƒ˜แƒก แƒ›แƒแƒ™แƒšแƒ” แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜
แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ BPF แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒแƒก แƒ“แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒแƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒ•แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ”แƒ— แƒกแƒขแƒแƒขแƒ˜แƒ, แƒกแƒแƒ“แƒแƒช แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ.

แƒ‘แƒแƒšแƒ แƒฌแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜, แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ›แƒ แƒ“แƒ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒแƒ› แƒ›แƒแƒ˜แƒžแƒแƒ•แƒ แƒžแƒแƒžแƒฃแƒšแƒแƒ แƒแƒ‘แƒ Linux-แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒ”แƒœแƒกแƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒจแƒ˜, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ›แƒแƒฆแƒแƒšแƒ˜ แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ. แƒแƒ› แƒขแƒ˜แƒžแƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ— แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒžแƒแƒžแƒฃแƒšแƒแƒ แƒฃแƒš แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒ”.แƒฌ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒจแƒ”แƒ›แƒแƒ•แƒšแƒ˜แƒ—แƒ˜ (แƒ™แƒ”แƒ แƒœแƒ”แƒšแƒ˜ แƒจแƒ”แƒ›แƒแƒ•แƒšแƒ˜แƒ—แƒ˜) แƒ“แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ˜แƒซแƒšแƒ”แƒ•แƒ, แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒแƒ— แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒฃแƒ แƒ˜ แƒคแƒ”แƒœแƒ, แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒก แƒงแƒ•แƒ”แƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒ“แƒแƒœ. แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒก แƒแƒ•แƒšแƒ˜แƒ— แƒแƒกแƒ”แƒ•แƒ” แƒฎแƒ“แƒ”แƒ‘แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”. แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒแƒก แƒฉแƒ•แƒ”แƒœ แƒ•แƒ”แƒœแƒ“แƒแƒ‘แƒ˜แƒ— แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”.

แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ˜ แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒ–แƒ” แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ— แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ–แƒ”แƒ“แƒœแƒแƒ“แƒ”แƒ‘แƒก (แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒ แƒ—แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜, แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒคแƒ”แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ, แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ.แƒจ.), แƒ แƒแƒช แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ 10 แƒ’แƒ‘/แƒฌแƒ› แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒ— แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒแƒก. แƒฃแƒคแƒ แƒ แƒ›แƒแƒฆแƒแƒšแƒ˜. แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒก แƒแƒ•แƒšแƒ˜แƒ—, แƒžแƒšแƒฃแƒก แƒกแƒฎแƒ•แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ (แƒžแƒแƒ แƒขแƒ˜แƒฃแƒšแƒ˜ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ) แƒ“แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒแƒ“ แƒ แƒ”แƒ’แƒฃแƒšแƒ˜แƒ แƒ”แƒ‘แƒ (NUMA แƒ‘แƒฃแƒฆแƒแƒšแƒขแƒ”แƒ แƒ˜แƒ, CPU แƒ˜แƒ–แƒแƒšแƒแƒชแƒ˜แƒแƒ“แƒ แƒ.แƒจ.) แƒจแƒ”แƒ”แƒกแƒแƒ‘แƒแƒ›แƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒ›แƒแƒฆแƒแƒšแƒ˜ แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ”แƒ‘แƒก. แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒแƒ› แƒแƒฎแƒแƒšแƒ˜ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ˜แƒก แƒกแƒแƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒ DPDK แƒ˜แƒœแƒขแƒ”แƒšแƒ˜แƒกแƒ’แƒแƒœ (แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ—แƒ•แƒ˜แƒ—แƒ›แƒคแƒ แƒ˜แƒœแƒแƒ•แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜), แƒ—แƒฃแƒ›แƒชแƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒกแƒฎแƒ•แƒ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก VPP Cisco-แƒ“แƒแƒœ (Vector Packet Processing), Netmap แƒ“แƒ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒกแƒœแƒแƒ‘แƒ˜.

แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒฅแƒกแƒ”แƒšแƒฃแƒ แƒ˜ แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒ”แƒ‘แƒแƒก แƒแƒฅแƒ•แƒก แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒ’แƒ˜ แƒฃแƒแƒ แƒงแƒแƒคแƒ˜แƒ—แƒ˜ แƒ›แƒฎแƒแƒ แƒ”แƒ”แƒ‘แƒ˜:

  • OS แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒแƒ แƒ˜แƒก แƒแƒ‘แƒกแƒขแƒ แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒคแƒ”แƒœแƒ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ›แƒ แƒฃแƒจแƒฃแƒแƒšแƒแƒ“ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒ แƒ—แƒแƒœ แƒ—แƒแƒ•แƒ˜แƒแƒœแƒ—แƒ˜ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜, แƒ›แƒแƒ— แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒœแƒ“แƒ แƒ›แƒแƒ แƒ—แƒแƒœ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒแƒžแƒแƒ แƒแƒขแƒฃแƒ แƒ. แƒ”แƒก แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒแƒก.
  • แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ•แƒฃแƒ—แƒ›แƒแƒ‘แƒ— แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒก, แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒแƒ แƒก แƒ•แƒแƒ›แƒ‘แƒแƒ‘แƒ— แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ›แƒแƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒš แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒ–แƒ”. แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ›แƒ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒœ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฃแƒ™แƒ•แƒ” แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒšแƒ˜ แƒ˜แƒงแƒแƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒแƒœ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ .
  • แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก sandbox แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜, แƒ แƒแƒช แƒกแƒ”แƒ แƒ˜แƒแƒ–แƒฃแƒšแƒแƒ“ แƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒก แƒ›แƒแƒ— แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก แƒ“แƒ แƒฎแƒ”แƒšแƒก แƒฃแƒจแƒšแƒ˜แƒก แƒ›แƒแƒ— แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒ˜แƒ แƒ”แƒ‘แƒแƒก แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ—แƒแƒœ.

แƒแƒ แƒกแƒ”แƒ‘แƒ˜แƒ—แƒแƒ“, แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒฉแƒแƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก, แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘แƒ แƒ›แƒ˜แƒ˜แƒฆแƒฌแƒ”แƒ•แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒ“แƒแƒœ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒ’แƒแƒ“แƒแƒแƒ“แƒ’แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ—. XDP แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒกแƒแƒžแƒ˜แƒ แƒ˜แƒกแƒžแƒ˜แƒ แƒแƒก: แƒ˜แƒก แƒ’แƒแƒ“แƒแƒแƒฅแƒ•แƒก แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒ“แƒแƒœ (แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜, แƒ’แƒแƒ“แƒแƒ›แƒงแƒ•แƒแƒœแƒ”แƒ‘แƒ˜, แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ“แƒ แƒ.แƒจ.) แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ–แƒแƒœแƒแƒจแƒ˜. XDP แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒจแƒ”แƒ•แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ›แƒแƒฎแƒ•แƒ“แƒ”แƒ‘แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜ แƒ“แƒ แƒกแƒแƒœแƒแƒ› แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ›แƒแƒ’แƒ–แƒแƒฃแƒ แƒแƒ‘แƒแƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒฅแƒ•แƒ”แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒ›แƒ“แƒ”. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒ’แƒแƒ˜แƒ–แƒแƒ แƒ“แƒ. แƒ—แƒฃแƒ›แƒชแƒ, แƒ แƒแƒ’แƒแƒ  แƒแƒซแƒšแƒ”แƒ•แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒฃแƒจแƒ•แƒแƒก แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜? แƒแƒ› แƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒ–แƒ” แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒก แƒ’แƒแƒชแƒ”แƒ›แƒแƒ›แƒ“แƒ” แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ แƒ แƒแƒ แƒ˜แƒก BPF.

BPF แƒ“แƒ eBPF

แƒ›แƒ—แƒšแƒแƒ“ แƒ›แƒ™แƒแƒคแƒ˜แƒ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“, BPF (Packet Filtering, Berkeley) แƒแƒ แƒ˜แƒก, แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜. แƒ”แƒก แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ˜แƒงแƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒฅแƒ”แƒ“แƒแƒœ แƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”แƒแƒ‘แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜.

BPF-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒ tcpdump. แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒ”แƒ‘แƒ˜แƒกแƒแƒก tcpdump แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒก แƒ’แƒแƒ›แƒแƒฎแƒแƒขแƒฃแƒšแƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒฎแƒแƒšแƒแƒ“ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒแƒ› แƒ’แƒแƒ›แƒแƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒก, แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒฆแƒ‘แƒ”แƒญแƒ“แƒ˜แƒšแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ’แƒแƒ›แƒแƒ—แƒฅแƒ›แƒ "tcp dst port 80โ€ แƒ”แƒฎแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ TCP แƒžแƒแƒ™แƒ”แƒขแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฉแƒแƒ›แƒแƒ“แƒ˜แƒก แƒžแƒแƒ แƒขแƒจแƒ˜ 80. แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒแƒ›แƒชแƒ˜แƒ แƒแƒก แƒ”แƒก แƒ’แƒแƒ›แƒแƒฎแƒแƒขแƒฃแƒšแƒ”แƒ‘แƒ BPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒแƒ“ แƒ’แƒแƒ“แƒแƒฅแƒชแƒ”แƒ•แƒ˜แƒ—.

$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12] (001) jeq #0x86dd jt 2 jf 6
(002) ldb [20] (003) jeq #0x6 jt 4 jf 15
(004) ldh [56] (005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23] (008) jeq #0x6 jt 9 jf 15
(009) ldh [20] (010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16] (013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0

แƒ”แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒ–แƒ”แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒฃแƒš แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก:

  • แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ (000): แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒžแƒแƒ™แƒ”แƒขแƒก แƒแƒคแƒกแƒ”แƒขแƒฃแƒ แƒ˜ 12, แƒ แƒแƒ’แƒแƒ แƒช 16-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ, แƒแƒ™แƒฃแƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒจแƒ˜. แƒแƒคแƒกแƒ”แƒขแƒ˜ 12 แƒจแƒ”แƒ”แƒกแƒแƒ‘แƒแƒ›แƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ”แƒ—แƒ”แƒ แƒขแƒ˜แƒžแƒก.
  • แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ (001): แƒแƒ“แƒแƒ แƒ”แƒ‘แƒก แƒแƒ™แƒฃแƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก 0x86dd-แƒก, แƒแƒœแƒฃ IPv6-แƒ˜แƒก แƒ”แƒ—แƒ”แƒ แƒขแƒ˜แƒžแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก. แƒ—แƒฃ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒ›แƒแƒ แƒ—แƒแƒšแƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒ˜ แƒ›แƒ˜แƒ“แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒแƒ–แƒ” (002), แƒฎแƒแƒšแƒ แƒ—แƒฃ แƒแƒ แƒ, แƒ›แƒแƒจแƒ˜แƒœ (006).
  • แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ (006): แƒแƒ“แƒแƒ แƒ”แƒ‘แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก 0x800-แƒ—แƒแƒœ (แƒ”แƒ—แƒ”แƒ แƒขแƒ˜แƒžแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ IPv4-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก). แƒ—แƒฃ แƒžแƒแƒกแƒฃแƒฎแƒ˜ แƒ›แƒแƒ แƒ—แƒแƒšแƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ›แƒ˜แƒ“แƒ˜แƒก (007), แƒ—แƒฃ แƒแƒ แƒ, แƒ›แƒแƒจแƒ˜แƒœ (015).

แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒกแƒแƒœแƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒแƒ  แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒก. แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜. แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ (แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ (014)) แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ“แƒแƒ”แƒ›แƒ—แƒฎแƒ•แƒ, แƒฎแƒแƒšแƒ แƒœแƒฃแƒšแƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ (แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ (015)) แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒแƒ  แƒ“แƒแƒ”แƒ›แƒ—แƒฎแƒ•แƒ.

BPF แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ”แƒ™แƒแƒ“แƒ˜ แƒจแƒ”แƒ›แƒแƒ’แƒ•แƒ—แƒแƒ•แƒแƒ–แƒ”แƒก แƒกแƒขแƒ˜แƒ• แƒ›แƒแƒ™แƒ™แƒ”แƒœแƒ›แƒ แƒ“แƒ แƒ•แƒแƒœ แƒฏแƒ”แƒ˜แƒ™แƒแƒ‘แƒกแƒแƒœแƒ›แƒ 1992 แƒฌแƒšแƒ˜แƒก แƒ‘แƒแƒšแƒแƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒ—แƒ˜ แƒœแƒแƒจแƒ แƒแƒ›แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒ“แƒ. BSD แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ˜: แƒแƒฎแƒแƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ” แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒ”แƒก แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ Usenix-แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ”แƒ แƒ”แƒœแƒชแƒ˜แƒแƒ–แƒ” 1993 แƒฌแƒšแƒ˜แƒก แƒ–แƒแƒ›แƒ—แƒแƒ แƒจแƒ˜.

แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› BPF แƒแƒ แƒ˜แƒก แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ, แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ’แƒแƒ แƒ”แƒ›แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก. แƒ’แƒแƒ แƒ“แƒ แƒ‘แƒแƒ˜แƒขแƒ”แƒ™แƒแƒ“แƒ˜แƒกแƒ, แƒ˜แƒก แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒก (แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ˜แƒ แƒ˜แƒ‘แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ–แƒ”), แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ”แƒ‘แƒก (A แƒ“แƒ X; แƒแƒ™แƒฃแƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜ แƒ“แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ”แƒ‘แƒ˜), แƒœแƒแƒ™แƒแƒฌแƒ แƒ˜แƒก แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜ แƒ“แƒ แƒ˜แƒ›แƒžแƒšแƒ˜แƒชแƒ˜แƒขแƒฃแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒ˜. แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒ แƒแƒ› BPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Motorola 6502 ISA-แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—. แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒขแƒ˜แƒ• แƒ›แƒแƒ™แƒ™แƒ”แƒœแƒ˜ แƒ˜แƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ“แƒ แƒ—แƒแƒ•แƒ˜แƒก แƒžแƒšแƒ”แƒœแƒแƒ แƒฃแƒšแƒ˜ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜ Sharkfest '11-แƒ–แƒ”, แƒ˜แƒก แƒ˜แƒชแƒœแƒแƒ‘แƒ“แƒ 6502-แƒก แƒฃแƒ›แƒแƒฆแƒšแƒ”แƒก แƒกแƒ™แƒแƒšแƒแƒจแƒ˜ Apple II-แƒ–แƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ“แƒ แƒแƒ› แƒชแƒแƒ“แƒœแƒแƒ› แƒ’แƒแƒ•แƒšแƒ”แƒœแƒ แƒ›แƒแƒแƒฎแƒ“แƒ˜แƒœแƒ แƒ›แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒ–แƒ” BPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒ˜แƒ–แƒแƒ˜แƒœแƒ–แƒ”.

BPF แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Linux-แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ v2.5 แƒ“แƒ แƒฃแƒคแƒ แƒ แƒ’แƒ•แƒ˜แƒแƒœ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ แƒฏแƒ”แƒ˜ แƒจแƒฃแƒšแƒ˜แƒขแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ . BPF แƒ™แƒแƒ“แƒ˜ แƒฃแƒชแƒ•แƒšแƒ”แƒšแƒ˜ แƒ“แƒแƒ แƒฉแƒ 2011 แƒฌแƒšแƒแƒ›แƒ“แƒ”, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ”แƒ แƒ˜แƒ™ แƒ“แƒ˜แƒฃแƒ›แƒแƒกแƒ”แƒขแƒ›แƒ แƒ’แƒแƒ“แƒแƒแƒคแƒแƒ แƒ›แƒ BPF แƒ—แƒแƒ แƒฏแƒ˜แƒ›แƒแƒœแƒ˜ JIT แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒฌแƒงแƒแƒ แƒ: JIT แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก). แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, BPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒžแƒ แƒ”แƒขแƒแƒชแƒ˜แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“, แƒ‘แƒ˜แƒ แƒ—แƒ•แƒก แƒจแƒ”แƒ”แƒซแƒšแƒ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ’แƒแƒ“แƒแƒ˜แƒงแƒ•แƒแƒœแƒแƒก BPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ แƒกแƒแƒ›แƒ˜แƒ–แƒœแƒ” แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒแƒจแƒ˜: x86, ARM, MIPS แƒ“แƒ แƒ.แƒจ.

แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ—, 2014 แƒฌแƒ”แƒšแƒก, แƒแƒšแƒ”แƒฅแƒกแƒ”แƒ˜ แƒกแƒขแƒแƒ แƒแƒ•แƒแƒ˜แƒขแƒแƒ•แƒ›แƒ แƒจแƒ”แƒกแƒ—แƒแƒ•แƒแƒ–แƒ แƒแƒฎแƒแƒšแƒ˜ JIT แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ BPF-แƒกแƒ—แƒ•แƒ˜แƒก. แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒแƒฎแƒแƒšแƒ˜ JIT แƒ’แƒแƒฎแƒ“แƒ แƒแƒฎแƒแƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ BPF-แƒ–แƒ” แƒ“แƒ แƒ”แƒฌแƒแƒ“แƒ eBPF. แƒ•แƒคแƒ˜แƒฅแƒ แƒแƒ‘, แƒแƒ แƒ˜แƒ•แƒ” VM แƒ—แƒแƒœแƒแƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ“แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒ แƒแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜แƒ eBPF-แƒ˜แƒก แƒ—แƒแƒ•แƒ–แƒ”. แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ‘แƒ”แƒ•แƒ  แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜, BPF แƒ›แƒแƒ˜แƒฎแƒกแƒ”แƒœแƒ˜แƒ”แƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช eBPF, แƒฎแƒแƒšแƒ แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF แƒ“แƒฆแƒ”แƒก แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜แƒ แƒ แƒแƒ’แƒแƒ แƒช cBPF.

eBPF แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒก แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ  BPF แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ’แƒ–แƒ˜แƒ—:

  • แƒ”แƒงแƒ แƒ“แƒœแƒแƒ‘แƒ แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” 64-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ”แƒ‘แƒก. eBPF แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก 64-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœ แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒ–แƒ แƒ“แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก 2-แƒ“แƒแƒœ (แƒแƒ™แƒฃแƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜ แƒ“แƒ X) 10-แƒ›แƒ“แƒ”. eBPF แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒแƒžแƒ™แƒแƒ“แƒ”แƒ‘แƒก (BPF_MOV, BPF_JNE, BPF_CALLโ€ฆ).
  • แƒ›แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ˜แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒคแƒ”แƒœแƒ˜แƒก แƒฅแƒ•แƒ”แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒ“แƒแƒœ. BPF แƒ˜แƒงแƒ แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ—แƒแƒœ. แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒ˜แƒ’แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ“แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒคแƒ˜แƒšแƒขแƒ แƒแƒ“, แƒ›แƒ˜แƒกแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒ˜แƒงแƒ แƒฅแƒ•แƒ”แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ“แƒ แƒฅแƒกแƒ”แƒšแƒฃแƒ  แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒก. แƒ—แƒฃแƒ›แƒชแƒ, eBPF แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒแƒฆแƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ—แƒแƒœ แƒ“แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒš แƒ˜แƒฅแƒœแƒแƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ›แƒ˜แƒ–แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒกแƒ” แƒ แƒแƒ›, แƒแƒฎแƒšแƒ eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒก tracepoint-แƒก แƒแƒœ kprobe-แƒก. แƒ”แƒก แƒฎแƒกแƒœแƒ˜แƒก แƒ™แƒแƒ แƒก eBPF แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒฎแƒ•แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒฅแƒ•แƒ”แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜. แƒแƒฎแƒšแƒ eBPF แƒ™แƒแƒ“แƒ˜ แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ’แƒ–แƒแƒ–แƒ”: kernel/bpf.
  • แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒ”แƒ‘แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒ— Maps. แƒ แƒฃแƒ™แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒกแƒแƒ™แƒ•แƒแƒœแƒซแƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ”แƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒชแƒ•แƒšแƒแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒกแƒ แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒก แƒจแƒแƒ แƒ˜แƒก. eBPF แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒกแƒแƒฎแƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒก.
  • แƒ›แƒ”แƒแƒ แƒแƒ“แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜. แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“, แƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒฏแƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ แƒแƒœ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ™แƒšแƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ. แƒ”แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— แƒ“แƒ แƒแƒ  แƒ›แƒ˜แƒ”แƒ™แƒฃแƒ—แƒ•แƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒก. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒก eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ.
  • แƒ“แƒแƒแƒกแƒ แƒฃแƒšแƒ”แƒ— แƒ–แƒแƒ แƒ”แƒ‘แƒ˜. แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ–แƒแƒ›แƒ eBPF-แƒจแƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜แƒ 4096 แƒ‘แƒแƒ˜แƒขแƒ˜แƒ—. แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒ˜แƒก แƒ–แƒแƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒแƒซแƒšแƒ”แƒ•แƒก eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜ แƒแƒฎแƒแƒš eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒ“แƒ แƒแƒ›แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒšแƒแƒฎแƒแƒก แƒ”แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ (แƒแƒ› แƒ’แƒ–แƒ˜แƒ— แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ 32-แƒ›แƒ“แƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ˜แƒงแƒแƒก แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜).

eBPF แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜

Linux-แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒจแƒ˜ eBPF-แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒ. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒœแƒ˜แƒ›แƒฃแƒจแƒ”แƒ‘แƒ–แƒ”/bpf/. แƒแƒ› แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ“แƒ’แƒ”แƒœแƒแƒ“, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ—:

$ sudo make samples/bpf/

แƒ›แƒ” แƒแƒ  แƒ“แƒแƒ•แƒฌแƒ”แƒ  แƒแƒฎแƒแƒš แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก eBPF-แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒ”แƒ แƒ—-แƒ”แƒ แƒ— แƒœแƒ˜แƒ›แƒฃแƒจแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ samples/bpf/-แƒจแƒ˜. แƒ›แƒ” แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ• แƒ™แƒแƒ“แƒ˜แƒก แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒœแƒแƒฌแƒ˜แƒšแƒก แƒ“แƒ แƒแƒ•แƒฎแƒกแƒœแƒ˜ แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒ” แƒแƒ•แƒ˜แƒ แƒฉแƒ˜แƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ tracex4.

แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒœแƒ˜แƒ›แƒฃแƒจแƒ”แƒ‘แƒจแƒ˜/bpf/ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒแƒ แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜แƒกแƒ’แƒแƒœ. แฒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜:

  • tracex4_kern.c, แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช eBPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜.
  • tracex4_user.c, แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒ“แƒแƒœ.

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ tracex4_kern.c eBPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒแƒ›แƒ“แƒ”. แƒแƒ› แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜, gcc แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜ eBPF-แƒกแƒ—แƒ•แƒ˜แƒก. แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, clang แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒแƒฌแƒแƒ แƒ›แƒแƒแƒก eBPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜. Makefile แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก clang แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ tracex4_kern.c แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ–แƒ”.

แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒ”, แƒ แƒแƒ› eBPF-แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ แƒฃแƒ™แƒ”แƒ‘แƒ˜. tracex4_kern แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ”แƒ แƒ— แƒ แƒฃแƒ™แƒแƒก:

struct pair {
    u64 val;
    u64 ip;
};  

struct bpf_map_def SEC("maps") my_map = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(long),
    .value_size = sizeof(struct pair),
    .max_entries = 1000000,
};

BPF_MAP_TYPE_HASH แƒแƒ แƒ˜แƒก eBPF-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒ›แƒแƒ—แƒแƒ•แƒแƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒกแƒแƒฎแƒ”แƒแƒ‘แƒ. แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฐแƒแƒจแƒ˜แƒ. แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒœแƒ˜แƒจแƒœแƒ”แƒ— แƒ แƒ”แƒ™แƒšแƒแƒ›แƒ SEC("maps"). SEC แƒแƒ แƒ˜แƒก แƒ›แƒแƒ™แƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ‘แƒ˜แƒœแƒแƒ แƒฃแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“. แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜ tracex4_kern แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜แƒ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒแƒ แƒ˜ โ€‹โ€‹แƒกแƒ”แƒฅแƒชแƒ˜แƒ:

SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{   
    long ptr = PT_REGS_PARM2(ctx);

    bpf_map_delete_elem(&my_map, &ptr); 
    return 0;
}
    
SEC("kretprobe/kmem_cache_alloc_node") 
int bpf_prog2(struct pt_regs *ctx)
{
    long ptr = PT_REGS_RC(ctx);
    long ip = 0;

    // ะฟะพะปัƒั‡ะฐะตะผ ip-ะฐะดั€ะตั ะฒั‹ะทั‹ะฒะฐัŽั‰ะตะน ัั‚ะพั€ะพะฝั‹ kmem_cache_alloc_node() 
    BPF_KRETPROBE_READ_RET_IP(ip, ctx);

    struct pair v = {
        .val = bpf_ktime_get_ns(),
        .ip = ip,
    };
    
    bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
    return 0;
}   

แƒ”แƒก แƒแƒ แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒฌแƒแƒจแƒแƒšแƒแƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ แƒฃแƒ™แƒ˜แƒ“แƒแƒœ (kprobe/kmem_cache_free) แƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒแƒฎแƒแƒšแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ แƒฃแƒ™แƒแƒ–แƒ” (kretprobe/kmem_cache_alloc_node). แƒ›แƒ—แƒแƒ•แƒ แƒฃแƒšแƒ˜ แƒแƒกแƒแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒจแƒ”แƒ”แƒกแƒแƒ‘แƒแƒ›แƒ”แƒ‘แƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒš แƒ›แƒแƒ™แƒ แƒแƒก bpf_helpers.h.

แƒ—แƒฃ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒกแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒก แƒ’แƒแƒ“แƒแƒ•แƒงแƒ แƒ˜, แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒ˜แƒœแƒแƒฎแƒ, แƒ แƒแƒ› แƒ”แƒก แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜แƒ:

$ objdump -h tracex4_kern.o

tracex4_kern.o: file format elf64-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

แฒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒกแƒ”แƒ•แƒ” tracex4_user.c, แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ. แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“, แƒ”แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒฃแƒกแƒ›แƒ”แƒœแƒก แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒก kmem_cache_alloc_node. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒแƒกแƒ”แƒ—แƒ˜ แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ แƒฎแƒ“แƒ”แƒ‘แƒ, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ eBPF แƒ™แƒแƒ“แƒ˜ แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ. แƒ™แƒแƒ“แƒ˜ แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก IP แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒก แƒ แƒฃแƒ™แƒแƒ–แƒ” แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒชแƒ˜แƒ™แƒšแƒ˜ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f

แƒ แƒแƒ’แƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ™แƒแƒกแƒ›แƒแƒกแƒฃแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ“แƒ eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ? แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒแƒก tracex4_user.c แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ tracex4_kern.o แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— load_bpf_file.

int main(int ac, char **argv)
{
    struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
    char filename[256];
    int i;

    snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);

    if (setrlimit(RLIMIT_MEMLOCK, &r)) {
        perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
        return 1;
    }

    if (load_bpf_file(filename)) {
        printf("%s", bpf_log_buf);
        return 1;
    }

    for (i = 0; ; i++) {
        print_old_objects(map_fd[1]);
        sleep(1);
    }

    return 0;
}

แƒ™แƒ”แƒ—แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก load_bpf_file แƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ eBPF แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒ–แƒแƒœแƒ“แƒ”แƒ‘แƒ˜ /sys/kernel/debug/tracing/kprobe_events. แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฃแƒกแƒ›แƒ”แƒœแƒ— แƒแƒ› แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒก แƒ“แƒ แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ แƒแƒ˜แƒ›แƒ” แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒก, แƒ แƒแƒชแƒ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ.

$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node

แƒงแƒ•แƒ”แƒšแƒ แƒกแƒฎแƒ•แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒœแƒ˜แƒ›แƒฃแƒจแƒจแƒ˜/bpf/ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒœแƒแƒšแƒแƒ’แƒ˜แƒฃแƒ แƒแƒ“. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒแƒ  แƒคแƒแƒ˜แƒšแƒก:

  • XXX_kern.c: eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ.
  • XXX_user.c: แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ.

eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ แƒฃแƒ™แƒ”แƒ‘แƒก แƒ“แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒแƒกแƒฎแƒ˜แƒ•แƒ”แƒ‘แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒขแƒ˜แƒžแƒ˜แƒก แƒ›แƒแƒ•แƒšแƒ”แƒœแƒแƒก (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, tracepoint), แƒจแƒ”แƒ™แƒ แƒฃแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ. แƒ แƒฃแƒ™แƒ”แƒ‘แƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒกแƒ แƒ“แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒจแƒแƒ แƒ˜แƒก.

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ BPF แƒ“แƒ eBPF แƒ’แƒแƒœแƒ˜แƒฎแƒ˜แƒšแƒ”แƒก แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—. แƒ•แƒ˜แƒชแƒ˜, แƒ แƒแƒ› แƒ“แƒฆแƒ”แƒก eBPF-แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ“แƒ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒแƒกแƒแƒšแƒแƒก แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—.

แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ—:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ