αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž„αŸ’αžαŸαž”αž’αŸ†αž–αžΈ BPF αž“αž·αž„ eBPF

αžŸαž½αžŸαŸ’αžαžΈ αž αžΆαž”! αž™αžΎαž„β€‹αžŸαžΌαž˜β€‹αž‡αž˜αŸ’αžšαžΆαž”β€‹αž‡αžΌαž“β€‹αž›αŸ„αž€β€‹αž’αŸ’αž“αž€β€‹αžαžΆ αž™αžΎαž„β€‹αž€αŸ†αž–αž»αž„β€‹αžšαŸ€αž”αž…αŸ†β€‹αžŸαŸ€αžœαž—αŸ…β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž…αŸαž‰β€‹αž•αŸ’αžŸαžΆαž™Β»αŸ”αž›αžΈαž“αž»αž… Observability αž‡αžΆαž˜αž½αž™ BPF".

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž„αŸ’αžαŸαž”αž’αŸ†αž–αžΈ BPF αž“αž·αž„ eBPF
αžŠαŸ„αž™αžŸαžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž BPF αž”αž“αŸ’αžαžœαž·αžœαžŒαŸ’αž αž“αž·αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž™αŸ‰αžΆαž„αžŸαž€αž˜αŸ’αž˜αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž™αžΎαž„αž”αžΆαž“αž”αž€αž”αŸ’αžšαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž“αžΌαžœαž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŸαž˜αžαŸ’αžαž—αžΆαž–αž…αž˜αŸ’αž”αž„ αž“αž·αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžšαž”αžŸαŸ‹αžœαžΆαŸ”

αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž†αŸ’αž“αžΆαŸ†αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸαŸ‡ αž§αž”αž€αžšαžŽαŸ αž“αž·αž„αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž€αžΆαžšαž–αŸαž‰αž“αž·αž™αž˜αž€αžΆαž“αŸ‹αžαŸ‚αžαŸ’αž›αžΆαŸ†αž„αž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΌαž‘αžΆαžαŸ‹αžŸαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž“αŸƒαžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž… αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹αŸ” αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŠαŸαž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αžαž˜αž½αž™αž“αŸƒαž”αŸ’αžšαž—αŸαž‘αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ αž•αŸ’αž›αžΌαžœαžœαžΆαž„αžαžΊαžŽαŸ‚αž› (αž•αŸ’αž›αžΌαžœαžœαžΆαž„αžαžΊαžŽαŸ‚αž›) αž“αž·αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰αžαžΊαžŽαŸ‚αž› αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαž‘αŸ†αž αŸ†αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž€αžΆαžšαžšαŸ†αž›αž„αžαžΊαžŽαŸ‚αž›αž€αŸαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžαž”αžŽαŸ’αžαžΆαž‰αž–αžΈ αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹. αž“αž·αž™αžΆαž™αž˜αŸ’αž™αŸ‰αžΆαž„αž‘αŸ€αžαž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αžΆαžαž”αžŽαŸ’αžαžΆαž‰αž™αžΎαž„αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎαž’αŸ’αž“αž€αž”αžΎαž€αž”αžš αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹.

αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž–αŸαž‰αž›αŸαž‰αž“αŸƒαž€αžΆαžαž”αžŽαŸ’αžαžΆαž‰αž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ user-space αž™αžΎαž„αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αžαžΊαžŽαŸ‚αž›αž›αžΎαžŸ (αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžšαž·αž”αž‘ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰ αž€αžΆαžšαžšαŸ†αžαžΆαž“αŸ”αž›αŸ”) αžŠαŸ‚αž›αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž›αŸ’αž”αžΏαž“ 10Gb/s αž¬αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡αŸ” Kernel bypass αž”αžΌαž€αžšαž½αž˜αž•αŸ’αžŸαŸ†αž“αŸƒαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž…αŸ‹) αž“αž·αž„αž€αžΆαžšαž›αŸƒαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαž»αž„αž”αŸ’αžšαž™αŸαžαŸ’αž“ (αž‚αžŽαž“αŸαž™αŸ’αž™ NUMA, αž—αžΆαž–αž―αž€αŸ„ CPUαž›) αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‚αŸ’αžšαžΉαŸ‡αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžŽαŸ’αžαžΆαž‰αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž‚αŸ†αžšαžΌαž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžαŸ’αž˜αžΈαž“αŸαŸ‡αž…αŸ†αž–αŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αžŒαžΈαŸ” αž—αžΈαŸ” αžŒαžΈαŸ” ខេ αž–αžΈ Intel (αž€αž‰αŸ’αž…αž”αŸ‹αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž™αž“αŸ’αžαž αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™) αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αžΆαž“αž§αž”αž€αžšαžŽαŸ αž“αž·αž„αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαž›αŸ’αž”αžΈαŸ—αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžšαž½αž˜αž‘αžΆαŸ†αž„ VPP αžšαž”αžŸαŸ‹ Cisco (Vector Packet Processing) Netmap αž“αž·αž„αž‡αžΆαž€αžΆαžšαž–αž·αžαŸ” Snabb.

αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž”αžŽαŸ’αžαžΆαž‰αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  • αžαžΊαžŽαŸ‚αž› OS αž‚αžΊαž‡αžΆαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž’αžšαžΌαž”αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αž’αžΆαž“αž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžœαž€αžΆαžŸαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αž“αž’αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αž–αž½αž€αž‚αŸαž€αŸαžαŸ’αžšαžΌαžœαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž•αž„αžŠαŸ‚αžšαŸ” αž“αŸαŸ‡αž…αŸ’αžšαžΎαž“αžαŸ‚αž˜αžΆαž“αž“αŸαž™αžαžΆαžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαž•αŸ’αž‘αžΆαž›αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
  • αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž™αžΎαž„αž”αŸ„αŸ‡αž”αž„αŸ‹αž…αŸ„αž›αž‘αŸ†αž αŸ†αžαžΊαžŽαŸ‚αž›αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž™αžΎαž„αž€αŸαž“αžΉαž„αž”αŸ„αŸ‡αž”αž„αŸ‹αž˜αž»αžαž„αžΆαžšαž”αžŽαŸ’αžαžΆαž‰αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™αžαžΊαžŽαŸ‚αž›αž•αž„αžŠαŸ‚αžšαŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž›αŸ†αž αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ†αž–αŸαž‰αž˜αž»αžαž„αžΆαžšαž‘αžΎαž„αžœαž·αž‰αžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™αžαžΊαžŽαŸ‚αž› αž¬αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžšαž½αž…αž αžΎαž™αŸ”
  • αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž” sandbox αžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹αž™αŸ‰αžΆαž„αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαž“αžΌαžœαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž“αž·αž„αžšαžΆαžšαžΆαŸ†αž„αž–αž½αž€αž‚αŸαž–αžΈαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™αž•αŸ’αž“αŸ‚αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αž›αžΉαž˜αžŸαžΆαžš αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αžŠαŸ„αž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž–αžΈαžαžΊαžŽαŸ‚αž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‘αŸ†αž αŸ†αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” XDP αž’αŸ’αžœαžΎαž•αŸ’αž‘αž»αž™αž–αžΈαž“αŸαŸ‡αŸ– αžœαžΆαž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αž–αžΈαž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (αžαž˜αŸ’αžšαž„ αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαŸ”αž›αŸ”) αž‘αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αžαžΊαžŽαŸ‚αž›αŸ” XDP αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž˜αž»αžαž„αžΆαžšαž”αžŽαŸ’αžαžΆαž‰αž˜αž½αž™αž—αŸ’αž›αžΆαž˜αŸ—αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αŸ‰αŸ‡αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžαžΆαž‰ αž“αž·αž„αž˜αž»αž“αž–αŸαž›αžœαžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžšαž„αž”αžŽαŸ’αžαžΆαž‰αžαžΊαžŽαŸ‚αž›αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž›αŸ’αž”αžΏαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž€αžΎαž“αž‘αžΎαž„αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžαžΎαžαžΊαžŽαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆ? αž˜αž»αž“αž“αžΉαž„αž†αŸ’αž›αžΎαž™αžŸαŸ†αžŽαž½αžšαž“αŸαŸ‡ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžαžΆαžαžΎ BPF αž‡αžΆαž’αŸ’αžœαžΈ?

BPF αž“αž·αž„ eBPF

αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžˆαŸ’αž˜αŸ„αŸ‡αž…αŸ’αžšαž‘αŸ†αž€αŸαžŠαŸ„αž™ BPF (Berkeley Packet Filtering) αžαžΆαž˜αž–αž·αžαž‚αžΊαž‡αžΆαž‚αŸ†αžšαžΌαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŠαŸ†αž”αžΌαž„αžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαžαŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αŸ”

αž§αž”αž€αžšαžŽαŸαžŠαŸαž›αŸ’αž”αžΈαž›αŸ’αž”αžΆαž‰αž”αŸ†αž•αž»αžαž˜αž½αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ BPF αž‚αžΊ tcpdump. αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž™αž€αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎ tcpdump αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αž“αŸ’αžŸαŸ„αž˜αž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžαŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ” αž˜αžΆαž“αžαŸ‚αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αž€αž“αŸ’αžŸαŸ„αž˜αž“αŸαŸ‡αž‘αŸαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž™αž€αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž€αž“αŸ’αžŸαŸ„αž˜ "tcp dst port 80” αžŸαŸ†αžŠαŸ…αž›αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ TCP αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αž€αžŠαž›αŸ‹αž…αŸ’αžšαž€ 80αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„αž’αžΆαž…αž”αž„αŸ’αžšαž½αž˜αž€αž“αŸ’αžŸαŸ„αž˜αž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ†αž”αŸ’αž›αŸ‚αž„αžœαžΆαž‘αŸ…αž‡αžΆ BPF bytecode αŸ”

$ 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 αž”αŸŠαžΈαž αž‘αŸ…αž€αŸ’αž“αž»αž„ accumulator αŸ” αž’αž»αž αŸ’αžœαžŸαž·αž 12 αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„ ethertype αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ”
  • αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ† (001)αŸ– αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„ accumulator αž‡αžΆαž˜αž½αž™ 0x86dd αž–αŸ„αž›αž‚αžΊαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž˜αŸ’αž›αŸƒ ethertype αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ IPv6αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αž‘αŸ’αž’αž•αž›αž‚αžΊαž–αž·αž αž“αŸ„αŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† (002) αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‘αŸ… (006)αŸ”
  • αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ† (006)αŸ– αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžαž˜αŸ’αž›αŸƒαž‡αžΆαž˜αž½αž™ 0x800 (αžαž˜αŸ’αž›αŸƒ ethertype αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ IPv4)αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αž˜αŸ’αž›αžΎαž™αž‚αžΊαž–αž·αž αž“αŸ„αŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ…αž€αžΆαž“αŸ‹ (007) αž”αžΎαž˜αž·αž“αž’αž‰αŸ’αž…αžΉαž„αž‘αŸ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‘αŸ… (015)αŸ”

αž αžΎαž™αž”αž“αŸ’αžαžšαž αžΌαžαžŠαž›αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αžšαž‘αž”αŸ‹αž›αž‘αŸ’αž’αž•αž›αŸ” αž“αŸαŸ‡αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž”αŸŠαžΌαž›αžΈαž“αŸ” αž€αžΆαžšαžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαž˜αž·αž“αž˜αŸ‚αž“αžŸαžΌαž“αŸ’αž™ (αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† (014)) αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž™αž€ αž αžΎαž™αž€αžΆαžšαžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαžŸαžΌαž“αŸ’αž™ (αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† (015)) αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž™αž€αž‘αŸαŸ”

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž BPF αž“αž·αž„ bytecode αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„αžŠαŸ„αž™ Steve McCann αž“αž·αž„ Van Jacobson αž“αŸ…αž…αž»αž„αž†αŸ’αž“αžΆαŸ† 1992 αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αŸ’αžšαžŠαžΆαžŸαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž– αžαž˜αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹ BSDαŸ– αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΆαž”αŸ‹αž™αž€αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž€αž˜αŸ’αžšαž·αžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž“αŸ’αž“αž·αžŸαžΈαž‘ Usenix αž€αŸ’αž“αž»αž„αžšαžŠαžΌαžœαžšαž„αžΆαžšαž†αŸ’αž“αžΆαŸ† 1993 αŸ”

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ BPF αž‚αžΊαž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αžœαžΆαž€αŸ†αžŽαžαŸ‹αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎ bytecode αžœαžΆαž€αŸαž€αŸ†αžŽαžαŸ‹αž‚αŸ†αžšαžΌαž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž”αžΆαž…αŸ‹ (αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž‘αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž™αŸ‰αžΆαž„αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αž”αžΆαž…αŸ‹) αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ (A αž“αž·αž„ X; accumulator αž“αž·αž„αž›αž·αž”αž·αž€αŸ’αžšαž˜αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡) αž€αžΆαžšαž•αŸ’αž‘αž»αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž€αŸ„αžŸ αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ BPF bytecode αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž‚αŸ†αžšαžΌαžαžΆαž˜ Motorola 6502 ISA αŸ” αžŠαžΌαž…αžŠαŸ‚αž› Steve McCann αž”αžΆαž“αžšαŸ†αž›αžΉαž€αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αŸ” αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž–αŸαž‰αž’αž„αŸ’αž‚ αž“αŸ… Sharkfest '11 αž‚αžΆαžαŸ‹αž’αŸ’αž›αžΆαž”αŸ‹αžŸαŸ’αž‚αžΆαž›αŸ‹ Build 6502 αžαžΆαŸ†αž„αž–αžΈαžšαŸ€αž“αž“αŸ…αžœαž·αž‘αŸ’αž™αžΆαž›αŸαž™αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Apple II αž αžΎαž™αž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αž“αŸαŸ‡αž”αžΆαž“αž‡αŸ‡αž₯αž‘αŸ’αž’αž·αž–αž›αž›αžΎαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαž BPF bytecode αŸ”

αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžš BPF αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚ v2.5 αž“αž·αž„αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‡αžΆαž…αž˜αŸ’αž”αž„αžŠαŸ„αž™αž€αžΆαžšαžαž·αžαžαŸ†αž”αŸ’αžšαžΉαž„αž”αŸ’αžšαŸ‚αž„αžšαž”αžŸαŸ‹ Jay Schullist αŸ” αž›αŸαžαž€αžΌαžŠ BPF αž“αŸ…αžαŸ‚αž˜αž·αž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžšαž αžΌαžαžŠαž›αŸ‹αž†αŸ’αž“αžΆαŸ† 2011 αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› Eric Dumaset αžšαž…αž“αžΆαž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚ BPF αž‘αžΎαž„αžœαž·αž‰αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αžšαž”αŸ€αž” JIT (αž”αŸ’αžšαž—αž–αŸ– JIT αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αžαžΊαžŽαŸ‚αž›αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž”αž€αžŸαŸ’αžšαžΆαž™ BPF bytecode αž’αžΆαž…αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž‡αžΆαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž‚αŸ„αž›αžŠαŸ…αŸ– x86, ARM, MIPS αž‡αžΆαžŠαžΎαž˜αŸ”

αž€αŸ’αžšαŸ„αž™αž˜αž€αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2014 Alexey Starovoitov αž”αžΆαž“αžŸαŸ’αž“αžΎαž™αž“αŸ’αžαž€αžΆαžš JIT αžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ BPF αŸ” αžαžΆαž˜αž–αž·αž JIT αžαŸ’αž˜αžΈαž“αŸαŸ‡αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ BPF αžαŸ’αž˜αžΈ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ eBPF αŸ” αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆ VMs αž‘αžΆαŸ†αž„αž–αžΈαžšαž”αžΆαž“αžšαž½αž˜αžšαžŸαŸ‹αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž˜αž½αž™αžšαž™αŸˆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž€αžΆαžšαžαŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ eBPF αŸ” αžαžΆαž˜αž–αž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸƒαž―αž€αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” BPF αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž™αž›αŸ‹αžαžΆαž‡αžΆ eBPF αž αžΎαž™ BPF αž”αž»αžšαžΆαžŽαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‡αžΆ cBPF αŸ”

eBPF αž–αž„αŸ’αžšαžΈαž€αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž BPF αž”αž»αžšαžΆαžŽαžαžΆαž˜αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ–

  • αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜ 64 αž”αŸŠαžΈαžαž‘αŸ†αž“αžΎαž”αŸ” eBPF αž”αŸ’αžšαžΎαž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ 64-bit αž“αž·αž„αž”αž„αŸ’αž€αžΎαž“αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž›αž˜αžΆαž“αž–αžΈ 2 (accumulator αž“αž·αž„ X) αžŠαž›αŸ‹ 10αŸ” eBPF αž€αŸαž•αŸ’αžαž›αŸ‹αž“αžΌαžœ opcodes αž”αž“αŸ’αžαŸ‚αž˜αž•αž„αžŠαŸ‚αžš (BPF_MOV, BPF_JNE, BPF_CALL...)αŸ”
  • αž”αžΆαž“αž•αŸ’αžŠαžΆαž…αŸ‹αž…αŸαž‰αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžšαž„αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰αŸ” BPF αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž“αžΉαž„αž‚αŸ†αžšαžΌαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αžΆαž…αŸ‹αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž€αžΌαžŠαžšαž”αžŸαŸ‹αžœαžΆαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžšαž„αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžαžΆαž˜αž”αžŽαŸ’αžαžΆαž‰αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž eBPF αž›αŸ‚αž„αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž‚αŸ†αžšαžΌαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ€αžαž αžΎαž™ αž αžΎαž™αž’αžΆαž…αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αžŽαžΆαž˜αž½αž™αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… tracepoint ឬ kprobe αŸ” αžœαžΆαž”αžΎαž€αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž§αž”αž€αžšαžŽαŸ eBPF αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž“αž·αž„αž€αžšαžŽαžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžšαž„αžαžΊαžŽαŸ‚αž›αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž›αŸαžαž€αžΌαžŠ eBPF αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž›αžΌαžœαžšαž”αžŸαŸ‹αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹αŸ– αžαžΊαžŽαŸ‚αž›/bpf αŸ”
  • αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž€αž›αžŠαŸ‚αž›αž αŸ…αžαžΆαž•αŸ‚αž“αž‘αžΈαŸ” αž•αŸ‚αž“αž‘αžΈαž‚αžΊαž‡αžΆαžƒαŸ’αž›αžΆαŸ†αž„αžαž˜αŸ’αž›αŸƒαž‚αž“αŸ’αž›αžΉαŸ‡αžŠαŸ‚αž›αž”αžΎαž€αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαžœαžΆαž„αž‘αŸ†αž αŸ†αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αž‘αŸ†αž αŸ†αžαžΊαžŽαŸ‚αž›αŸ” eBPF αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž•αŸ‚αž“αž‘αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αž”αŸ’αžšαž—αŸαž‘αŸ”
  • αž˜αž»αžαž„αžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž”αž“αŸ’αžŸαŸ†αŸ” αž‡αžΆαž–αž·αžŸαŸαžŸ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαž€αž‰αŸ’αž…αž”αŸ‹αž‘αžΎαž„αžœαž·αž‰ αž‚αžŽαž“αžΆαž˜αžΌαž›αž”αŸ’αž”αž‘αžΆαž“αž”αŸαžαŸ’αžš αž¬αž€αŸ’αž›αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αŸ” αž˜αž»αžαž„αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› αž αžΎαž™αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž›αŸ†αž αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αŸαŸ” αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž αŸ…αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αž•αž„αžŠαŸ‚αžšαŸ”
  • αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αŸ” αž‘αŸ†αž αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ eBPF αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΉαž˜ 4096 αž”αŸƒαŸ” αž˜αž»αžαž„αžΆαžšαž αŸ…αž€αž“αŸ’αž‘αž»αž™αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αž•αŸ’αž‘αŸαžšαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αžαŸ’αž˜αžΈ αž αžΎαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžšαŸ†αž›αž„αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž“αŸαŸ‡ (αžšαž αžΌαžαžŠαž›αŸ‹ 32 αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžœαž·αž’αžΈαž“αŸαŸ‡)αŸ”

eBPF: αž§αž‘αžΆαž αžšαžŽαŸ

αž˜αžΆαž“αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ eBPF αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž—αž–αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αŸ” αž–αž½αž€αžœαžΆαž˜αžΆαž“αž“αŸ…αž‚αŸ†αžšαžΌ/bpf/αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž…αž„αž€αŸ’αžšαž„αž§αž‘αžΆαž αžšαžŽαŸαž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž‰αŸ’αž…αžΌαž›αŸ–

$ sudo make samples/bpf/

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αžŸαžšαžŸαŸαžšαž§αž‘αžΆαž αžšαžŽαŸαžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ eBPF αžαŸ’αž›αž½αž“αž―αž„αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αžΉαž„αž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž‚αŸ†αžšαžΌαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ†αžšαžΌ/bpf/αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αžΎαž›αž•αŸ’αž“αŸ‚αž€αžαŸ’αž›αŸ‡αž“αŸƒαž€αžΌαžŠ αž αžΎαž™αž–αž“αŸ’αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ tracex4.

αž‡αžΆαž‘αžΌαž‘αŸ…αž§αž‘αžΆαž αžšαžŽαŸαž“αžΈαž˜αž½αž™αŸ—αž€αŸ’αž“αž»αž„αž‚αŸ†αžšαžΌ/bpf/ αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž–αžΈαžšαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈβ€‹αž“αŸαŸ‡:

  • tracex4_kern.cαž˜αžΆαž“αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αž‡αžΆ eBPF bytecodeαŸ”
  • tracex4_user.cαž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αžΈαž‘αŸ†αž αŸ†αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αž„αž€αŸ’αžšαž„ tracex4_kern.c αž‘αŸ… eBPF bytecode αŸ” αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸ…αž€αŸ’αž“αž»αž„ gcc αž˜αž·αž“αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ eBPF αž‘αŸαŸ” αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ clang αž’αžΆαž…αž”αž‰αŸ’αž…αŸαž‰ eBPF bytecodeαŸ” 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹