BPF рд░ eBPF рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп

рдирдорд╕реНрддреЗ, Habr! рд╣рд╛рдореА рддрдкрд╛рдИрд▓рд╛рдИ рдЬрд╛рдирдХрд╛рд░реА рдЧрд░рд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреМрдВ рдХрд┐ рд╣рд╛рдореА рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд╕реНрддрдХ рддрдпрд╛рд░ рдЧрд░реНрджреИрдЫреМрдВред"BPF рдХреЛ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдпрддрд╛".

BPF рд░ eBPF рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп
BPF рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рд╡рд┐рдХрд╕рд┐рдд рд╣реБрди рдЬрд╛рд░реА рдЫ рд░ рдЕрднреНрдпрд╛рд╕рдорд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рднрдЗрд░рд╣реЗрдХреЛ рдЫ, рд╣рд╛рдореАрд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рд▓рд╛рдЧрд┐ рдпрд╕рдХреЛ рдореБрдЦреНрдп рдХреНрд╖рдорддрд╛рд╣рд░реВ рд░ рд╡рд░реНрддрдорд╛рди рдЕрд╡рд╕реНрдерд╛ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рд▓реЗрдЦ рдЕрдиреБрд╡рд╛рдж рдЧрд░реЗрдХрд╛ рдЫреМрдВред

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

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

рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдорд╛ рд╕рдЮреНрдЬрд╛рд▓ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрджрд╛ рдзреЗрд░реИ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН:

  • OS рдХрд░реНрдиреЗрд▓ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЕрдореВрд░реНрдд рддрд╣ рд╣реЛред рдХрд┐рдирднрдиреЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕реНрд░реЛрддрд╣рд░реВ рд╕реАрдзреИ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрдиреБрдкрд░реНрджрдЫ, рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЖрдлреНрдиреИ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрдирд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрдиреБрдкрд░реНрджрдЫред рдпрд╕рдХреЛ рдЕрд░реНрде рдкреНрд░рд╛рдпрдГ рдЖрдлреНрдиреИ рдбреНрд░рд╛рдЗрднрд░рд╣рд░реВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЧрд░реНрдиреБ рд╣реЛред
  • рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд▓реЗ рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рддреНрдпрд╛рдЧрд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореА рдХрд░реНрдиреЗрд▓рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рдиреЗрдЯрд╡рд░реНрдХрд┐рдЩ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рд╣рд░реВ рдкрдирд┐ рдЫреЛрдбреНрджреИрдЫреМрдВред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдХрд░реНрдиреЗрд▓ рд╡рд╛ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорджреНрд╡рд╛рд░рд╛ рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЗрдПрдХрд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкреБрди: рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрдкрд░реНрдЫред
  • рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рд╕реНрдпрд╛рдиреНрдбрдмрдХреНрд╕ рдореЛрдбрдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рд╣реБрдиреНрдЫрдиреН, рдЬрд╕рд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдЧрдореНрднреАрд░ рд░реВрдкрдорд╛ рд╕реАрдорд┐рдд рдЧрд░реНрджрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдордХрд╛ рдЕрдиреНрдп рднрд╛рдЧрд╣рд░реВрд╕рдБрдЧ рдПрдХреАрдХреГрдд рд╣реБрдирдмрд╛рдЯ рд░реЛрдХреНрдЫред

рд╕рдВрдХреНрд╖реЗрдкрдорд╛, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдорд╛ рдиреЗрдЯрд╡рд░реНрдХрд┐рдЩ рдЧрд░реНрджрд╛, рдХрд░реНрдиреЗрд▓рдмрд╛рдЯ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдорд╛ рдкреНрдпрд╛рдХреЗрдЯ рдкреНрд░рд╢реЛрдзрди рд╕рд╛рд░реНрджреИ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рднрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░рд┐рдиреНрдЫред XDP рд▓реЗ рдареАрдХ рдЙрд▓реНрдЯреЛ рдЧрд░реНрдЫ: рдпрд╕рд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ (рдлрд┐рд▓реНрдЯрд░рд╣рд░реВ, рд░рд┐рдЬреЛрд▓реНрднрд░рд╣рд░реВ, рд░рд╛рдЙрдЯрд┐рдВрдЧ, рдЖрджрд┐) рдмрд╛рдЯ рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕рдорд╛ рдиреЗрдЯрд╡рд░реНрдХрд┐рдЩ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рд╕рд╛рд░реНрдЫред XDP рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдкреНрдпрд╛рдХреЗрдЯ рд╣рд┐рдЯ рд╣реБрдиреЗ рдмрд┐рддреНрддрд┐рдХреИ рд░ рдпреЛ рдХрд░реНрдиреЗрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдкреНрд░рдгрд╛рд▓реАрдорд╛ рдЬрд╛рди рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдХрд╛рд░реНрдп рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдкреНрдпрд╛рдХреЗрдЯ рдкреНрд░рд╢реЛрдзрди рдЧрддрд┐ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдмрдвреНрдЫред рдпрджреНрдпрдкрд┐, рдХрд╕рд░реА рдХрд░реНрдиреЗрд▓рд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕рдорд╛ рдЖрдлреНрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ? рдпреЛ рдкреНрд░рд╢реНрдирдХреЛ рдЬрд╡рд╛рдл рджрд┐рдиреБ рдЕрдШрд┐, BPF рдХреЗ рд╣реЛ рд╣реЗрд░реМрдВред

BPF рд░ eBPF

рднреНрд░рд╛рдордХ рдирд╛рдордХреЛ рдмрд╛рд╡рдЬреБрдж, BPF (рдмрд░реНрдХрд▓реЗ рдкреНрдпрд╛рдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдЩ) рд╡рд╛рд╕реНрддрд╡рдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рдореЛрдбреЗрд▓ рд╣реЛред рдпреЛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рдореВрд▓ рд░реВрдкрдорд╛ рдкреНрдпрд╛рдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдЩ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдирд╛рдоред

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 рдХреЛ рд▓рд╛рдЧрд┐ ethertype рдорд╛рди) рд╕рдБрдЧ рдорд╛рди рддреБрд▓рдирд╛ рдЧрд░реНрджрдЫред рдпрджрд┐ рдЬрд╡рд╛рдл рд╕рд╣реА рдЫ рднрдиреЗ, рдХрд╛рд░реНрдпрдХреНрд░рдо (007) рдорд╛ рдЬрд╛рдиреНрдЫ, рдпрджрд┐ рд╣реЛрдЗрди рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ (015) рдорд╛ рдЬрд╛рдиреНрдЫред

рд░ рдкреНрдпрд╛рдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдЩ рдХрд╛рд░реНрдпрдХреНрд░рдорд▓реЗ рдирддрд┐рдЬрд╛ рдирдЖрдПрд╕рдореНрдоред рдпреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдмреБрд▓рд┐рдпрди рд╣реЛред рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди (рдирд┐рд░реНрджреЗрд╢рди (014)) рдлрд░реНрдХрд╛рдЙрдиреБрдХреЛ рдЕрд░реНрде рдкреНрдпрд╛рдХреЗрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рд░ рд╢реВрдиреНрдп рдорд╛рди (рдирд┐рд░реНрджреЗрд╢рди (015)) рдлрд░реНрдХрд╛рдЙрдиреБрдХреЛ рдЕрд░реНрде рдкреНрдпрд╛рдХреЗрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдПрдиред

BPF рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рд░ рдпрд╕рдХреЛ рдмрд╛рдЗрдЯрдХреЛрдб рд╕реНрдЯреАрд╡ рдореНрдпрд╛рдХрдХреНрдпрд╛рди рд░ рднреНрдпрд╛рди рдЬреНрдпрд╛рдХрдмрд╕рдирд▓реЗ 1992 рдХреЛ рдЕрдиреНрддрдорд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реЗрдХрд╛ рдерд┐рдП рдЬрдм рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкреЗрдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рднрдпреЛред BSD рдкреНрдпрд╛рдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░: рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрддрд░ рдкреНрдпрд╛рдХреЗрдЯ рдХреНрдпрд╛рдкреНрдЪрд░рдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рдпреЛ рдкреНрд░рд╡рд┐рдзрд┐ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ 1993 рдХреЛ рдЬрд╛рдбреЛ рдорд╛ Usenix рд╕рдореНрдореЗрд▓рди рдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

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

BPF рд╕рдорд░реНрдерди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓рдорд╛ v2.5 рд░ рдЙрдЪреНрдЪ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ, рдореБрдЦреНрдп рд░реВрдкрдорд╛ Jay Schullist рдХреЛ рдкреНрд░рдпрд╛рд╕рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдердкрд┐рдПрдХреЛред BPF рдХреЛрдб 2011 рд╕рдореНрдо рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реНрдпреЛ, рдЬрдм рдПрд░рд┐рдХ рдбреБрдорд╛рд╕реЗрдЯрд▓реЗ BPF рджреЛрднрд╛рд╖реЗрд▓рд╛рдИ JIT рдореЛрдбрдорд╛ рдЪрд▓рд╛рдЙрди рдкреБрди: рдбрд┐рдЬрд╛рдЗрди рдЧрд░реЗ (рд╕реНрд░реЛрдд: рдкреНрдпрд╛рдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ JIT)ред рдпрд╕ рдкрдЫрд┐, рдХрд░реНрдиреЗрд▓рд▓реЗ, BPF bytecode рдХреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛, BPF рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВрд▓рд╛рдИ рд▓рдХреНрд╖рд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдХреНрдЫ: x86, ARM, MIPS, рдЖрджрд┐ред

рдкрдЫрд┐, 2014 рдорд╛, Alexey Starovoitov BPF рдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ JIT рд╕рдВрдпрдиреНрддреНрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рддред рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпреЛ рдирдпрд╛рдБ JIT рдирдпрд╛рдБ BPF- рдЖрдзрд╛рд░рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рднрдпреЛ рд░ eBPF рднрдирд┐рдиреНрдереНрдпреЛред рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рджреБрдмреИ VM рд╣рд░реВ рдХреЗрд╣реА рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╣рдЕрд╕реНрддрд┐рддреНрд╡рдорд╛ рдерд┐рдП, рддрд░ рд╣рд╛рд▓ рдкреНрдпрд╛рдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ 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 рдХреЛрдб рдпрд╕рдХреЛ рдЖрдлреНрдиреИ рдорд╛рд░реНрдЧрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫ: рдХрд░реНрдиреЗрд▓/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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди