BPF рдЖрдгрд┐ eBPF рдЪрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп

рд╣реЕрд▓реЛ, рд╣реЕрдмреНрд░! рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд│рд╡реВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдЖрдореНрд╣реА рдкреНрд░рдХрд╛рд╢рдирд╛рд╕рд╛рдареА рдПрдХ рдкреБрд╕реНрддрдХ рддрдпрд╛рд░ рдХрд░рдд рдЖрд╣реЛрдд."BPF рд╕рд╣ рд▓рд┐рдирдХреНрд╕ рдирд┐рд░реАрдХреНрд╖рдгрдХреНрд╖рдорддрд╛".

BPF рдЖрдгрд┐ eBPF рдЪрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп
BPF рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╕рддрдд рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдЖрдгрд┐ рд╕рд░рд╛рд╡рд╛рдордзреНрдпреЗ рд╕рдХреНрд░рд┐рдпрдкрдгреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЖрдореНрд╣реА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рдХреНрд╖рдорддрд╛ рдЖрдгрд┐ рд╕рджреНрдп рд╕реНрдерд┐рддреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░рд╛ рд▓реЗрдЦ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ.

рдЕрд▓рд┐рдХрдбрдЪреНрдпрд╛ рд╡рд░реНрд╖рд╛рдВрдд, рдЙрдЪреНрдЪ-рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреЕрдХреЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓рдЪреНрдпрд╛ рдорд░реНрдпрд╛рджрд╛рдВрдЪреА рднрд░рдкрд╛рдИ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рддрдВрддреНрд░реЗ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЭрд╛рд▓реА рдЖрд╣реЗрдд. рдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рддрдВрддреНрд░рд╛рдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгрддрд╛рдд рдХрд░реНрдирд▓ рдмрд╛рдпрдкрд╛рд╕ (рдХрд░реНрдирд▓ рдмрд╛рдпрдкрд╛рд╕) рдЖрдгрд┐ рдХрд░реНрдирд▓ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░рд▓рд╛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реВрди, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреЗрд╡рд░реВрди рд╕рд░реНрд╡ рдкреЕрдХреЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдХрд░реНрдирд▓ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рдордзреНрдпреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреЗ рджреЗрдЦреАрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЬрд╛рдЧрд╛. рджреБрд╕рд▒реНрдпрд╛ рд╢рдмреНрджрд╛рдВрдд, рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдбрд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛, рдЖрдореНрд╣реА рдбреНрд░рд╛рдпрд╡реНрд╣рд░рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЬрд╛рдЧрд╛.

рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдбрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд░рдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реВрди, рдЖрдореНрд╣реА рдХрд░реНрдирд▓ рдУрд╡реНрд╣рд░рд╣реЗрдб (рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ, рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдЗрдВрдЯрд░рдкреНрдЯреНрд╕ рдЗ.) рдХрдореА рдХрд░рддреЛ, рдЬреЗ 10Gb/s рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рд╣реВрди рдЕрдзрд┐рдХ рд╡реЗрдЧрд╛рдиреЗ рдЪрд╛рд▓рдд рдЕрд╕рддрд╛рдирд╛ рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рдХрд░реНрдирд▓ рдмрд╛рдпрдкрд╛рд╕ рдЖрдгрд┐ рдЗрддрд░ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪреЗ рд╕рдВрдпреЛрдЬрди (рдмреЕрдЪ рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдЖрдгрд┐ рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдЯреНрдпреВрдирд┐рдВрдЧ (NUMA рд▓реЗрдЦрд╛, CPU рдЕрд▓рдЧрд╛рд╡, рдЗ.) рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреАрд▓ рдЙрдЪреНрдЪ-рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреНрдпрд╛ рдореВрд▓рднреВрдд рддрддреНрддреНрд╡рд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ. рдХрджрд╛рдЪрд┐рдд рдкреЕрдХреЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреНрдпрд╛ рдпрд╛ рдирд╡реАрди рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪреЗ рдЕрдиреБрдХрд░рдгреАрдп рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ рдбреАрдкреАрдбреАрдХреЗ рдЗрдВрдЯреЗрд▓ рдХрдбреВрди (рдбреЗрдЯрд╛ рдкреНрд▓реЗрди рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ), рдЬрд░реА рд╕рд┐рд╕реНрдХреЛрдЪреЗ рд╡реНрд╣реАрдкреАрдкреА (рд╡реЗрдХреНрдЯрд░ рдкреЕрдХреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ), рдиреЗрдЯрдореЕрдк рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ, рдпрд╛рд╕рд╣ рдЗрддрд░ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рддрдВрддреНрд░реЗ рдЖрд╣реЗрдд. рд╕реНрдиреЕрдм.

рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреЗрдд рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рдж рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рдЕрдиреЗрдХ рддреЛрдЯреЗ рдЖрд╣реЗрдд:

  • OS рдХрд░реНрдирд▓ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╕рдВрд╕рд╛рдзрдирд╛рдВрд╕рд╛рдареА рдПрдХ рдЕтАНреЕрдмрд╕реНрдЯреНрд░реЕрдХреНрд╢рди рд▓реЗрдпрд░ рдЖрд╣реЗ. рдХрд╛рд░рдг рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдирд╛ рддреНрдпрд╛рдВрдЪреЗ рд╕рдВрд╕рд╛рдзрди рдереЗрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддрд╛рдд, рддреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рджреЗрдЦреАрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЖрдкрд▓реНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдбреНрд░рд╛рдпрд╡реНрд╣рд░реНрд╕рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • рдХрд╛рд░рдг рдЖрдореНрд╣реА рдХрд░реНрдирд▓рдЪреА рдЬрд╛рдЧрд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╕реЛрдбреВрди рджреЗрдд рдЖрд╣реЛрдд, рдЖрдореНрд╣реА рдХрд░реНрдирд▓рджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реА рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреЗрдЦреАрд▓ рд╕реЛрдбреВрди рджреЗрдд рдЖрд╣реЛрдд. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░реЕрдореНрд╕рдиреА рдХрд░реНрдирд▓ рдХрд┐рдВрд╡рд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдорджреНрд╡рд╛рд░реЗ рдЖрдзреАрдЪ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд╛рдЧреВ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдБрдбрдмреЙрдХреНрд╕ рдореЛрдбрдордзреНрдпреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд, рдЬреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рд▓рд╛ рдЧрдВрднреАрд░рдкрдгреЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдордЪреНрдпрд╛ рдЗрддрд░ рднрд╛рдЧрд╛рдВрд╕рд╣ рдПрдХрддреНрд░рд┐рдд рд╣реЛрдгреНрдпрд╛рдкрд╛рд╕реВрди рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ.

рдереЛрдбрдХреНрдпрд╛рдд, рдпреБрдЬрд░ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХрд░рддрд╛рдирд╛, рдкреЕрдХреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░реНрдирд▓рдордзреВрди рдпреБрдЬрд░ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рд╣рд▓рд╡реВрди рдкрд░рдлреЙрд░реНрдордиреНрд╕ рдирдлрд╛ рдорд┐рд│рд╡рд▓рд╛ рдЬрд╛рддреЛ. XDP рдЕрдЧрджреА рдЙрд▓рдЯ рдХрд░рддреЗ: рддреЗ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреЗрд╡рд░реВрди (рдлрд┐рд▓реНрдЯрд░реНрд╕, рд░рд┐рдЭреЛрд▓реНрд╡реНрд╣рд░реНрд╕, рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЗ.) рдХрд░реНрдирд▓ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рд╣рд▓рд╡рддреЗ. рдкреЕрдХреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕рд╡рд░ рдЖрджрд│рддрд╛рдЪ рдЖрдгрд┐ рдХрд░реНрдирд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ рдЬрд╛рдгреНрдпрд╛рдкреВрд░реНрд╡реА XDP рдЖрдореНрд╣рд╛рд▓рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдкрд░рд┐рдгрд╛рдореА, рдкреЕрдХреЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреА рдЧрддреА рд▓рдХреНрд╖рдгреАрдп рд╡рд╛рдврддреЗ. рддрдерд╛рдкрд┐, рдХрд░реНрдирд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдХрд░реНрдирд▓ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдХрд╢реА рджреЗрддреЗ? рдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджреЗрдгреНрдпрд╛рдкреВрд░реНрд╡реА, BPF рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рддреЗ рдкрд╛рд╣реВ.

BPF рдЖрдгрд┐ eBPF

рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрдгрд╛рд░реЗ рдирд╛рд╡ рдЕрд╕реВрдирд╣реА, BPF (Berkeley Packet Filtering) рд╣реЗ рдЦрд░реЗ рддрд░ рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдореЙрдбреЗрд▓ рдЖрд╣реЗ. рд╣реЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдореВрд│рддрдГ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ рд╣реЛрддреЗ, рдореНрд╣рдгреВрди рд╣реЗ рдирд╛рд╡.

BPF рд╡рд╛рдкрд░реВрди рд╕рд░реНрд╡рд╛рдд рдкреНрд░рд╕рд┐рджреНрдз рд╕рд╛рдзрдирд╛рдВрдкреИрдХреА рдПрдХ рдЖрд╣реЗ tcpdump. рд╡рд╛рдкрд░реВрди рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░ рдХрд░рддрд╛рдирд╛ tcpdump рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ. рдХреЗрд╡рд│ рдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддреАрд╢реА рдЬреБрд│рдгрд╛рд░реА рдкреЕрдХреЗрдЯреНрд╕ рдХреЕрдкреНрдЪрд░ рдХреЗрд▓реА рдЬрд╛рддреАрд▓. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЕрднрд┐рд╡реНрдпрдХреНрддреА "tcp dst port 80тАЭ рдкреЛрд░реНрдЯ 80 рд╡рд░ рдпреЗрдгрд╛рд░реНтАНрдпрд╛ рд╕рд░реНрд╡ TCP рдкреЕрдХреЗрдЯреНрд╕рдЪрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ. рдХрдВрдкрд╛рдпрд▓рд░ рдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддреАрд▓рд╛ 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)) рдкрд░рдд рдХрд░рдгреЗ рдореНрд╣рдгрдЬреЗ рдкреЕрдХреЗрдЯ рд╕реНрд╡реАрдХрд╛рд░рд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА.

рд╕реНрдЯреАрд╡реНрд╣ рдореЕрдХрдХреЕрди рдЖрдгрд┐ рд╡реНрд╣реЕрди рдЬреЗрдХрдмрд╕рди рдпрд╛рдВрдиреА 1992 рдЪреНрдпрд╛ рдЙрддреНрддрд░рд╛рд░реНрдзрд╛рдд рдмреАрдкреАрдПрдл рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдмрд╛рдпрдХреЛрдб рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗрд▓реЗ рд╣реЛрддреЗ рдЬреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдВрдЪрд╛ рдкреЗрдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЭрд╛рд▓рд╛ рд╣реЛрддрд╛. BSD рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░: рд╡рд╛рдкрд░рдХрд░реНрддрд╛-рд╕реНрддрд░реАрдп рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░рд╕рд╛рдареА рдирд╡реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рд╣реЗ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдкреНрд░рдердо 1993 рдЪреНрдпрд╛ рд╣рд┐рд╡рд╛рд│реНрдпрд╛рдд Usenix рдкрд░рд┐рд╖рджреЗрдд рд╕рд╛рджрд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.

BPF рд╣реЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рддреЗ рдХреЛрдгрддреНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡рддрд╛рдд рддреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ. рдмрд╛рдЗрдЯрдХреЛрдб рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рддреЗ рдмреЕрдЪ рдореЗрдорд░реА рдореЙрдбреЗрд▓ (рд▓реЛрдб рд╕реВрдЪрдирд╛ рдмреЕрдЪрд╡рд░ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд), рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕ (A рдЖрдгрд┐ X; рд╕рдВрдЪрдпрдХ рдЖрдгрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕), рд╕реНрдХреНрд░реЕрдЪ рдореЗрдорд░реА рд╕реНрдЯреЛрд░реЗрдЬ рдЖрдгрд┐ рдПрдХ рдЕрд╡реНрдпрдХреНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рдЙрдВрдЯрд░ рджреЗрдЦреАрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ. рд╡рд┐рд╢реЗрд╖ рдореНрд╣рдгрдЬреЗ, BPF рдмрд╛рдпрдХреЛрдб рдореЛрдЯреЛрд░реЛрд▓рд╛ 6502 ISA рдирдВрддрд░ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ. рд╕реНрдЯреАрд╡реНрд╣ рдореЕрдХрдХреЕрдирдиреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдард╡рдгреАрдкреНрд░рдорд╛рдгреЗ рдкреВрд░реНрдг рдЕрд╣рд╡рд╛рд▓ рд╢рд╛рд░реНрдХрдлреЗрд╕реНрдЯ '11 рдордзреНрдпреЗ, рддреНрдпрд╛рд▓рд╛ Apple II рд╡рд░реАрд▓ рд╣рд╛рдпрд╕реНрдХреВрд▓ рджрд┐рд╡рд╕рд╛рдВрдЪреНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдкрд╛рд╕реВрди рдмрд┐рд▓реНрдб 6502 рдЪреА рдУрд│рдЦ рд╣реЛрддреА рдЖрдгрд┐ рдпрд╛ рдЬреНрдЮрд╛рдирд╛рдиреЗ BPF рдмрд╛рдпрдХреЛрдб рдбрд┐рдЭрд╛рдЗрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рдорд╛рд╡рд░ рдкреНрд░рднрд╛рд╡ рдкрд╛рдбрд▓рд╛.

BPF рд╕рдорд░реНрдерди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓рдордзреНрдпреЗ v2.5 рдЖрдгрд┐ рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рдЬреЗ рдореБрдЦреНрдпрддрдГ рдЬрдп рд╢реБрд▓рд┐рд╕реНрдЯрдЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдВрдиреА рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ. 2011 рдкрд░реНрдпрдВрдд BPF рдХреЛрдб рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╛рд╣рд┐рд▓рд╛, рдЬреЗрд╡реНрд╣рд╛ рдПрд░рд┐рдХ рдбреБрдорд╛рд╕реЗрдЯрдиреЗ BPF рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░рд▓рд╛ JIT рдореЛрдбрдордзреНрдпреЗ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдиреНрд╣рд╛ рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ (рд╕реНрд░реЛрдд: рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд╕рд╛рдареА JIT). рдпрд╛рдирдВрддрд░, рдХрд░реНрдирд▓, BPF рдмрд╛рдпрдХреЛрдбрдЪрд╛ рдЕрд░реНрде рд▓рд╛рд╡рдгреНрдпрд╛рдРрд╡рдЬреА, рдереЗрдЯ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдирд╛ рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реВ рд╢рдХрддреЛ: x86, ARM, MIPS, рдЗ.

рдирдВрддрд░, 2014 рдордзреНрдпреЗ, Alexey Starovoitov BPF рд╕рд╛рдареА рдирд╡реАрди JIT рдпрдВрддреНрд░рдгрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗрд▓реА. рдЦрд░рдВ рддрд░, рд╣реА рдирд╡реАрди JIT рдирд╡реАрди BPF-рдЖрдзрд╛рд░рд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрдирд▓реА рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ eBPF рдореНрд╣рдЯрд▓реЗ рдЧреЗрд▓реЗ. рдорд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрддреЗ рдХреА рджреЛрдиреНрд╣реА рд╡реНрд╣реАрдПрдо рдХрд╛рд╣реА рдХрд╛рд│ рдПрдХрддреНрд░ рд╣реЛрддреЗ, рдкрд░рдВрддреБ рд╕рдзреНрдпрд╛ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ eBPF рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЦрд░рдВ рддрд░, рдЖрдзреБрдирд┐рдХ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рдЕрдиреЗрдХ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ, BPF рд╣реЗ eBPF рд╕рдордЬрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╢рд╛рд╕реНрддреНрд░реАрдп BPF рдЖрдЬ cBPF рдореНрд╣рдгреВрди рдУрд│рдЦрд▓реЗ рдЬрд╛рддреЗ.

eBPF рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрдиреЗрдХ рдкреНрд░рдХрд╛рд░реЗ рдХрд░рддреЗ:

  • рдЖрдзреБрдирд┐рдХ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╡рд░ рдЖрдзрд╛рд░рд┐рдд. eBPF 64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕ рд╡рд╛рдкрд░рддреЗ рдЖрдгрд┐ рдЙрдкрд▓рдмреНрдз рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕рдЪреА рд╕рдВрдЦреНрдпрд╛ 2 (рдПрдХреНрдпреБрдореНрдпреБрд▓реЗрдЯрд░ рдЖрдгрд┐ X) рд╡рд░реВрди 10 рдкрд░реНрдпрдВрдд рд╡рд╛рдврд╡рддреЗ. eBPF рдЕрддрд┐рд░рд┐рдХреНрдд opcodes (BPF_MOV, BPF_JNE, BPF_CALL...) рджреЗрдЦреАрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.
  • рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░ рдЙрдкрдкреНрд░рдгрд╛рд▓реАрдкрд╛рд╕реВрди рдЕрд▓рд┐рдкреНрдд. BPF рдмреЕрдЪ рдбреЗрдЯрд╛ рдореЙрдбреЗрд▓рд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рд╣реЛрддреЗ. рддреЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреНрдпрд╛рдЪрд╛ рдХреЛрдб рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдкреНрд░реЗрд╖рдг рдкреНрд░рджрд╛рди рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рдЙрдкрдкреНрд░рдгрд╛рд▓реАрдордзреНрдпреЗ рд╕реНрдерд┐рдд рд╣реЛрддрд╛. рддрдерд╛рдкрд┐, eBPF рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдпрд╛рдкреБрдвреЗ рдбреЗрдЯрд╛ рдореЙрдбреЗрд▓рд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдирд╛рд╣реА рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рддреНрдпрд╛рдореБрд│реЗ, рдЖрддрд╛ eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯреНрд░реЗрд╕рдкреЙрдИрдВрдЯ рдХрд┐рдВрд╡рд╛ kprobe рд╢реА рдЬреЛрдбрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рд╣реЗ рдЗрддрд░ рдХрд░реНрдирд▓ рдЙрдкрдкреНрд░рдгрд╛рд▓реАрдВрдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд eBPF рдЗрдиреНрд╕реНрдЯреНрд░реБрдореЗрдВрдЯреЗрд╢рди, рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдгрд┐ рдЗрддрд░ рдЕрдиреЗрдХ рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдгрд╛рдВрд╕рд╛рдареА рдорд╛рд░реНрдЧ рдЙрдШрдбрддреЗ. рдЖрддрд╛ eBPF рдХреЛрдб рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдорд╛рд░реНрдЧрд╛рд╡рд░ рд╕реНрдерд┐рдд рдЖрд╣реЗ: kernel/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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛